perm filename MF.PSC[MF,DEK]3 blob
sn#760423 filedate 1984-07-03 generic text, type T, neo UTF8
{4:}{9:}{$C-,A+,D-,W+}{[$D:2]}{$C+,D:7,W+}{:9}PROGRAM MF;LABEL{6:}
1,9998,9999;{:6}CONST{11:}MEMMAX=60000;MAXINTERNAL=50;BUFSIZE=500;
ERRORLINE=72;HALFERRORLIN=42;MAXPRINTLINE=79;SCREENWIDTH=492;
SCREENDEPTH=456;STACKSIZE=30;MAXSTRINGS=1500;STRINGVACANC=8000;
POOLSIZE=32000;MOVESIZE=5000;GFBUFSIZE=800;FILENAMESIZE=23;
POOLNAME='MF.POOL[MF,SYS] ';PATHSIZE=100;
COUNTNAME='<TEX!>.TXT[TEX,SYS] ';CHECKPERIOD=10;WRITEPERIOD=12;
BISTACKSIZE=768;HEADERSIZE=100;LIGTABLESIZE=300;MAXFONTDIMEN=50;{:11}
TYPE{18:}ASCIICODE=0..127;{:18}{24:}EIGHTBITS=0..255;
ALPHAFILE=PACKED FILE OF CHAR;BYTEFILE=PACKED FILE OF EIGHTBITS;{:24}
{37:}POOLPOINTER=0..POOLSIZE;STRNUMBER=0..MAXSTRINGS;{:37}{98:}
SCALED=INTEGER;SMALLNUMBER=0..63;{:98}{102:}FRACTION=INTEGER;{:102}
{103:}ANGLE=INTEGER;{:103}{150:}QUARTERWORD=0..511;HALFWORD=0..262143;
TWOCHOICES=1..2;THREECHOICES=1..3;TWOHALVES=PACKED RECORD RH:HALFWORD;
CASE TWOCHOICES OF 1:(LH:HALFWORD);2:(B0:QUARTERWORD;B1:QUARTERWORD);
END;FOURQUARTERS=PACKED RECORD B0:QUARTERWORD;B1:QUARTERWORD;
B2:QUARTERWORD;B3:QUARTERWORD;END;
MEMORYWORD=RECORD CASE THREECHOICES OF 1:(INT:INTEGER);2:(HH:TWOHALVES);
3:(QQQQ:FOURQUARTERS);END;WORDFILE=FILE OF MEMORYWORD;{:150}{181:}
COMMANDCODE=1..81;{:181}{519:}SCREENROW=0..SCREENDEPTH;
SCREENCOL=0..SCREENWIDTH;TRANSSPEC=ARRAY[SCREENROW]OF SCREENCOL;
PIXELCOLOR=0..1;{:519}{525:}WINDOWNUMBER=0..15;{:525}{576:}
INSTATERECOR=RECORD INDEXFIELD:QUARTERWORD;
STARTFIELD,LOCFIELD,LIMITFIELD,NAMEFIELD:HALFWORD;END;{:576}{1077:}
GFINDEX=0..GFBUFSIZE;PACKEDBYTES=PACKED ARRAY[GFINDEX]OF EIGHTBITS;
{:1077}VAR{13:}BAD:INTEGER;{:13}{20:}XORD:ARRAY[CHAR]OF ASCIICODE;
XCHR:ARRAY[ASCIICODE]OF CHAR;{:20}{25:}
NAMEOFFILE:PACKED ARRAY[1..FILENAMESIZE]OF CHAR;
NAMELENGTH:0..FILENAMESIZE;{:25}{29:}
BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;FIRST:0..BUFSIZE;LAST:0..BUFSIZE;
MAXBUFSTACK:0..BUFSIZE;AUXBUF:ARRAY[0..70]OF CHAR;{:29}{38:}
STRPOOL:PACKED ARRAY[POOLPOINTER]OF ASCIICODE;
STRSTART:ARRAY[STRNUMBER]OF POOLPOINTER;POOLPTR:POOLPOINTER;
STRPTR:STRNUMBER;INITPOOLPTR:POOLPOINTER;INITSTRPTR:STRNUMBER;{:38}{42:}
STRREF:ARRAY[STRNUMBER]OF 0..127;{:42}{50:}POOLFILE:ALPHAFILE;{:50}{54:}
LOGFILE:ALPHAFILE;SELECTOR:0..5;DIG:ARRAY[0..22]OF 0..15;TALLY:INTEGER;
TERMOFFSET:0..MAXPRINTLINE;FILEOFFSET:0..MAXPRINTLINE;
TRICKBUF:ARRAY[0..ERRORLINE]OF ASCIICODE;TRICKCOUNT:INTEGER;
FIRSTCOUNT:INTEGER;{:54}{67:}INTERACTION:0..3;{:67}{70:}
DELETIONSALL:BOOLEAN;HISTORY:0..3;ERRORCOUNT:-1..100;{:70}{73:}
HELPLINE:ARRAY[0..5]OF STRNUMBER;HELPPTR:0..6;USEERRHELP:BOOLEAN;
ERRHELP:STRNUMBER;{:73}{89:}INTERRUPT:INTEGER;OKTOINTERRUP:BOOLEAN;{:89}
{95:}ARITHERROR:BOOLEAN;{:95}{123:}TWOTOTHE:ARRAY[0..30]OF INTEGER;
SPECLOG:ARRAY[1..28]OF INTEGER;{:123}{131:}
SPECATAN:ARRAY[1..26]OF ANGLE;{:131}{138:}NSIN,NCOS:FRACTION;{:138}
{142:}RANDOMS:ARRAY[0..54]OF FRACTION;JRANDOM:0..54;{:142}{152:}
TEMPPTR:HALFWORD;{:152}{153:}MEM:ARRAY[0..MEMMAX]OF MEMORYWORD;{:153}
{154:}VARUSED,DYNUSED:INTEGER;MAXVARUSED:INTEGER;{:154}{155:}
AVAIL:HALFWORD;MEMEND:HALFWORD;{:155}{160:}ROVER:HALFWORD;{:160}{173:}
FREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;
WASFREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;WASMEMEND:HALFWORD;
PANICKING:BOOLEAN;{:173}{184:}INTERNAL:ARRAY[1..MAXINTERNAL]OF SCALED;
INTNAME:ARRAY[1..MAXINTERNAL]OF STRNUMBER;INTPTR:32..MAXINTERNAL;{:184}
{190:}OLDSETTING:0..5;{:190}{192:}
CHARCLASS:ARRAY[ASCIICODE]OF ASCIICODE;{:192}{194:}HASHUSED:HALFWORD;
STCOUNT:INTEGER;{:194}{195:}HASH:ARRAY[1..2243]OF TWOHALVES;
EQTB:ARRAY[1..2243]OF TWOHALVES;{:195}{222:}
BIGNODESIZE:ARRAY[14..15]OF SMALLNUMBER;{:222}{241:}SAVEPTR:HALFWORD;
{:241}{260:}PATHTAIL:HALFWORD;{:260}{273:}
DELTAX,DELTAY,DELTA:ARRAY[0..PATHSIZE]OF SCALED;
PSI:ARRAY[1..PATHSIZE]OF ANGLE;{:273}{277:}
THETA:ARRAY[0..PATHSIZE]OF ANGLE;UU:ARRAY[0..PATHSIZE]OF FRACTION;
VV:ARRAY[0..PATHSIZE]OF ANGLE;WW:ARRAY[0..PATHSIZE]OF FRACTION;{:277}
{292:}ST,CT,SF,CF:FRACTION;{:292}{302:}
MOVE:ARRAY[0..MOVESIZE]OF INTEGER;MOVEPTR:0..MOVESIZE;{:302}{303:}
BISECTSTACK:ARRAY[0..BISTACKSIZE]OF INTEGER;BISECTPTR:0..BISTACKSIZE;
{:303}{321:}CUREDGES:HALFWORD;CURWT:INTEGER;{:321}{357:}TRACEX:INTEGER;
TRACEY:INTEGER;TRACEYY:INTEGER;{:357}{374:}CURX,CURY:SCALED;{:374}{382:}
WINDINGNUMBE:INTEGER;{:382}{403:}OCTANTNUMBER:ARRAY[1..8]OF 1..8;
OCTANTCODE:ARRAY[1..8]OF 1..8;{:403}{415:}
XCORR,YCORR:ARRAY[1..8]OF 0..1;XYCORR:ARRAY[1..8]OF 0..1;{:415}{422:}
CURM,CURN,CURD,CURDD:INTEGER;OCTANT:1..8;
GOOD1,GOOD2,GOOD3:ARRAY[1..8]OF INTEGER;{:422}{465:}
ENVMOVE:ARRAY[0..MOVESIZE]OF INTEGER;{:465}{510:}CURT,CURTT:INTEGER;
{:510}{520:}{SCREENPIXEL:ARRAY[SCREENROW,SCREENCOL]OF PIXELCOLOR;}{:520}
{523:}SCREENSTARTE:BOOLEAN;SCREENOK:BOOLEAN;{:523}{526:}
WINDOWOPEN:ARRAY[WINDOWNUMBER]OF BOOLEAN;
LEFTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
RIGHTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
TOPROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
BOTROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
MWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
NWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
WINDOWTIME:ARRAY[WINDOWNUMBER]OF INTEGER;{:526}{533:}
ROWTRANSITIO:TRANSSPEC;{:533}{545:}FIXNEEDED:BOOLEAN;WATCHCOEFS:BOOLEAN;
DEPFINAL:HALFWORD;{:545}{573:}CURCMD:EIGHTBITS;CURMOD:INTEGER;
CURSYM:HALFWORD;{:573}{577:}
INPUTSTACK:ARRAY[0..STACKSIZE]OF INSTATERECOR;INPUTPTR:0..STACKSIZE;
MAXINSTACK:0..STACKSIZE;CURINPUT:INSTATERECOR;{:577}{580:}INOPEN:0..6;
INPUTFILE:ARRAY[1..6]OF ALPHAFILE;LINE:INTEGER;
LINESTACK:ARRAY[1..6]OF INTEGER;PAGE:INTEGER;
PAGESTACK:ARRAY[1..6]OF INTEGER;{:580}{582:}
PARAMSTACK:ARRAY[0..150]OF HALFWORD;PARAMPTR:0..150;
MAXPARAMSTAC:INTEGER;{:582}{583:}FILEPTR:0..STACKSIZE;{:583}{607:}
SCANNERSTATU:0..6;WARNINGINFO:INTEGER;{:607}{627:}FORCEEOF:BOOLEAN;
{:627}{684:}CONDPTR:HALFWORD;IFLIMIT:0..4;CURIF:SMALLNUMBER;
IFLINE:INTEGER;{:684}{698:}LOOPPTR:HALFWORD;{:698}{712:}
CURNAME:STRNUMBER;CURAREA:STRNUMBER;CUREXT:STRNUMBER;{:712}{713:}
AREADELIMITE:POOLPOINTER;EXTDELIMITER:POOLPOINTER;{:713}{720:}
MFBASEDEFAUL:PACKED ARRAY[1..18]OF CHAR;{:720}{727:}JOBNAME:STRNUMBER;
LOGNAME:STRNUMBER;{:727}{735:}GFFILE:BYTEFILE;OUTPUTFILENA:STRNUMBER;
{:735}{740:}CURTYPE:SMALLNUMBER;CUREXP:INTEGER;{:740}{759:}
VARFLAG:0..81;{:759}{887:}TXX,TXY,TYX,TYY,TX,TY:SCALED;{:887}{1011:}
LONGHELPSEEN:BOOLEAN;{:1011}{1014:}TFMFILE:BYTEFILE;
METRICFILENA:STRNUMBER;{:1014}{1023:}BC,EC:EIGHTBITS;
TFMWIDTH:ARRAY[EIGHTBITS]OF SCALED;TFMHEIGHT:ARRAY[EIGHTBITS]OF SCALED;
TFMDEPTH:ARRAY[EIGHTBITS]OF SCALED;
TFMITALCORR:ARRAY[EIGHTBITS]OF SCALED;
CHAREXISTS:ARRAY[EIGHTBITS]OF BOOLEAN;CHARTAG:ARRAY[EIGHTBITS]OF 0..3;
CHARREMAINDE:ARRAY[EIGHTBITS]OF EIGHTBITS;
HEADERBYTE:ARRAY[1..HEADERSIZE]OF-1..255;
LIGKERN:ARRAY[0..LIGTABLESIZE]OF FOURQUARTERS;NL:0..LIGTABLESIZE;
KERN:ARRAY[EIGHTBITS]OF SCALED;NK:0..256;
EXTEN:ARRAY[EIGHTBITS]OF FOURQUARTERS;NE:0..256;
PARAM:ARRAY[1..MAXFONTDIMEN]OF SCALED;NP:0..MAXFONTDIMEN;
NW,NH,ND,NI:0..256;{:1023}{1046:}PERTURBATION:SCALED;{:1046}{1052:}
DIMENHEAD:ARRAY[1..4]OF HALFWORD;{:1052}{1063:}MAXTFMDIMEN:SCALED;
TFMCHANGED:INTEGER;{:1063}{1075:}GFMINX,GFMAXX,GFMINY,GFMAXY:INTEGER;
GFPREVPTR:INTEGER;TOTALCHARS:INTEGER;CHARPTR:ARRAY[EIGHTBITS]OF INTEGER;
GFWIDTH:ARRAY[EIGHTBITS]OF INTEGER;{:1075}{1078:}GFBUF:PACKEDBYTES;
HALFBUF:GFINDEX;GFLIMIT:GFINDEX;GFPTR:GFINDEX;GFOFFSET:INTEGER;{:1078}
{1105:}BASEIDENT:STRNUMBER;{:1105}{1111:}BASEFILE:WORDFILE;{:1111}
{1126:}READYALREADY:INTEGER;{:1126}{1137:}PSEUDOTYPEIN:STRNUMBER;{:1137}
{1140:}{COUNTFILE:ALPHAFILE;}{:1140}{1148:}
ESCBREAK:ARRAY[1..1]OF INTEGER;{:1148}PROCEDURE INITIALIZE;VAR{19:}
I:0..127;{:19}{124:}K:INTEGER;{:124}BEGIN{21:}XCHR[32]:=' ';
XCHR[33]:='!';XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';
XCHR[38]:='&';XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';
XCHR[43]:='+';XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';
XCHR[48]:='0';XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';
XCHR[53]:='5';XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';
XCHR[58]:=':';XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';
XCHR[63]:='?';XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';
XCHR[68]:='D';XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';
XCHR[73]:='I';XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';
XCHR[78]:='N';XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';
XCHR[83]:='S';XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';
XCHR[88]:='X';XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';
XCHR[93]:=']';XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';
XCHR[98]:='b';XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';
XCHR[102]:='f';XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';
XCHR[106]:='j';XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';
XCHR[110]:='n';XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';
XCHR[114]:='r';XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';
XCHR[118]:='v';XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';
XCHR[122]:='z';XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';
XCHR[126]:='~';XCHR[0]:=' ';XCHR[127]:=' ';{:21}{22:}
FOR I:=1 TO 31 DO XCHR[I]:=CHR(I);XCHR[24]:=CHR(95);XCHR[26]:=CHR(27);
XCHR[27]:=CHR(126);{:22}{23:}FOR I:=0 TO 127 DO XORD[CHR(I)]:=127;
FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;XORD[CHR(9)]:=32;{:23}{68:}
INTERACTION:=3;{:68}{71:}DELETIONSALL:=TRUE;ERRORCOUNT:=0;{:71}{74:}
HELPPTR:=0;USEERRHELP:=FALSE;ERRHELP:=0;{:74}{90:}INTERRUPT:=0;
OKTOINTERRUP:=TRUE;{:90}{96:}ARITHERROR:=FALSE;{:96}{125:}
TWOTOTHE[0]:=1;FOR K:=1 TO 30 DO TWOTOTHE[K]:=2*TWOTOTHE[K-1];
SPECLOG[1]:=93032640;SPECLOG[2]:=38612034;SPECLOG[3]:=17922280;
SPECLOG[4]:=8662214;SPECLOG[5]:=4261238;SPECLOG[6]:=2113709;
SPECLOG[7]:=1052693;SPECLOG[8]:=525315;SPECLOG[9]:=262400;
SPECLOG[10]:=131136;SPECLOG[11]:=65552;SPECLOG[12]:=32772;
SPECLOG[13]:=16385;FOR K:=14 TO 27 DO SPECLOG[K]:=TWOTOTHE[27-K];
SPECLOG[28]:=1;{:125}{132:}SPECATAN[1]:=27855475;SPECATAN[2]:=14718068;
SPECATAN[3]:=7471121;SPECATAN[4]:=3750058;SPECATAN[5]:=1876857;
SPECATAN[6]:=938658;SPECATAN[7]:=469357;SPECATAN[8]:=234682;
SPECATAN[9]:=117342;SPECATAN[10]:=58671;SPECATAN[11]:=29335;
SPECATAN[12]:=14668;SPECATAN[13]:=7334;SPECATAN[14]:=3667;
SPECATAN[15]:=1833;SPECATAN[16]:=917;SPECATAN[17]:=458;
SPECATAN[18]:=229;SPECATAN[19]:=115;SPECATAN[20]:=57;SPECATAN[21]:=29;
SPECATAN[22]:=14;SPECATAN[23]:=7;SPECATAN[24]:=4;SPECATAN[25]:=2;
SPECATAN[26]:=1;{:132}{174:}WASMEMEND:=0;PANICKING:=FALSE;{:174}{185:}
FOR K:=1 TO 32 DO INTERNAL[K]:=0;INTPTR:=32;{:185}{193:}
FOR K:=48 TO 57 DO CHARCLASS[K]:=0;CHARCLASS[46]:=1;
FOR K:=0 TO 32 DO CHARCLASS[K]:=2;CHARCLASS[24]:=10;CHARCLASS[26]:=10;
CHARCLASS[28]:=10;CHARCLASS[29]:=10;CHARCLASS[12]:=20;CHARCLASS[127]:=2;
CHARCLASS[37]:=3;CHARCLASS[34]:=4;CHARCLASS[44]:=5;CHARCLASS[59]:=6;
CHARCLASS[40]:=7;CHARCLASS[41]:=8;FOR K:=65 TO 90 DO CHARCLASS[K]:=9;
FOR K:=97 TO 122 DO CHARCLASS[K]:=9;CHARCLASS[95]:=9;CHARCLASS[60]:=10;
CHARCLASS[61]:=10;CHARCLASS[62]:=10;CHARCLASS[58]:=10;
CHARCLASS[124]:=10;CHARCLASS[96]:=11;CHARCLASS[39]:=11;
CHARCLASS[43]:=12;CHARCLASS[45]:=12;CHARCLASS[47]:=13;CHARCLASS[42]:=13;
CHARCLASS[92]:=13;CHARCLASS[33]:=14;CHARCLASS[63]:=14;CHARCLASS[35]:=15;
CHARCLASS[38]:=15;CHARCLASS[64]:=15;CHARCLASS[36]:=15;CHARCLASS[94]:=16;
CHARCLASS[126]:=16;CHARCLASS[91]:=17;CHARCLASS[93]:=18;
CHARCLASS[123]:=19;CHARCLASS[125]:=19;{:193}{196:}HASH[1].LH:=0;
HASH[1].RH:=0;EQTB[1].LH:=39;EQTB[1].RH:=0;
FOR K:=2 TO 2243 DO BEGIN HASH[K]:=HASH[1];EQTB[K]:=EQTB[1];END;{:196}
{223:}BIGNODESIZE[14]:=12;BIGNODESIZE[15]:=4;{:223}{242:}SAVEPTR:=0;
{:242}{404:}OCTANTCODE[1]:=1;OCTANTCODE[2]:=5;OCTANTCODE[3]:=6;
OCTANTCODE[4]:=2;OCTANTCODE[5]:=4;OCTANTCODE[6]:=8;OCTANTCODE[7]:=7;
OCTANTCODE[8]:=3;FOR K:=1 TO 8 DO OCTANTNUMBER[OCTANTCODE[K]]:=K;{:404}
{416:}XCORR[1]:=0;YCORR[1]:=0;XYCORR[1]:=0;XCORR[5]:=0;YCORR[5]:=0;
XYCORR[5]:=1;XCORR[6]:=0;YCORR[6]:=1;XYCORR[6]:=0;XCORR[2]:=1;
YCORR[2]:=0;XYCORR[2]:=1;XCORR[4]:=1;YCORR[4]:=1;XYCORR[4]:=1;
XCORR[8]:=1;YCORR[8]:=1;XYCORR[8]:=0;XCORR[7]:=1;YCORR[7]:=0;
XYCORR[7]:=1;XCORR[3]:=0;YCORR[3]:=1;XYCORR[3]:=0;{:416}{423:}
FOR K:=1 TO 8 DO BEGIN GOOD1[K]:=XYCORR[K]-XCORR[K]+YCORR[K];
GOOD2[K]:=32768-YCORR[K]+GOOD1[K];
IF ODD(K)THEN GOOD3[K]:=1 ELSE GOOD3[K]:=0;END;{:423}{434:}
MEM[3].HH.LH:=0;MEM[3].HH.RH:=0;MEM[4].HH.LH:=1;MEM[4].HH.RH:=0;
FOR K:=5 TO 11 DO MEM[K]:=MEM[4];MEM[12].INT:=0;MEM[0].HH.RH:=0;
MEM[0].HH.LH:=0;MEM[1].INT:=0;MEM[2].INT:=0;{:434}{524:}
SCREENSTARTE:=FALSE;SCREENOK:=FALSE;{:524}{527:}
FOR K:=0 TO 15 DO BEGIN WINDOWOPEN[K]:=FALSE;WINDOWTIME[K]:=0;END;{:527}
{546:}FIXNEEDED:=FALSE;WATCHCOEFS:=TRUE;{:546}{685:}CONDPTR:=0;
IFLIMIT:=0;CURIF:=0;IFLINE:=0;{:685}{721:}
MFBASEDEFAUL:='PLAIN.bas[tex,sys]';{:721}{741:}CUREXP:=0;{:741}{760:}
VARFLAG:=0;{:760}{1012:}LONGHELPSEEN:=FALSE;{:1012}{1024:}
FOR K:=0 TO 255 DO BEGIN TFMWIDTH[K]:=0;TFMHEIGHT[K]:=0;TFMDEPTH[K]:=0;
TFMITALCORR[K]:=0;CHAREXISTS[K]:=FALSE;CHARTAG[K]:=0;CHARREMAINDE[K]:=0;
END;FOR K:=1 TO HEADERSIZE DO HEADERBYTE[K]:=-1;BC:=255;EC:=0;NL:=0;
NK:=0;NE:=0;NP:=0;{:1024}{1076:}GFPREVPTR:=0;TOTALCHARS:=0;{:1076}
{1079:}HALFBUF:=GFBUFSIZE DIV 2;GFLIMIT:=GFBUFSIZE;GFPTR:=0;GFOFFSET:=0;
{:1079}{1106:}BASEIDENT:=0;{:1106}{1138:}PSEUDOTYPEIN:=0;PAGE:=0;{:1138}
END;{57:}PROCEDURE PRINTLN;BEGIN CASE SELECTOR OF 3:BEGIN WRITELN(TTY);
WRITELN(LOGFILE);TERMOFFSET:=0;FILEOFFSET:=0;END;
2:BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;END;1:BEGIN WRITELN(TTY);
TERMOFFSET:=0;END;0,4,5:;END;END;{:57}{58:}
PROCEDURE PRINTCHAR(S:ASCIICODE);
BEGIN CASE SELECTOR OF 3:BEGIN WRITE(TTY,XCHR[S]);
WRITE(LOGFILE,XCHR[S]);TERMOFFSET:=TERMOFFSET+1;
FILEOFFSET:=FILEOFFSET+1;
IF TERMOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(TTY);TERMOFFSET:=0;END;
IF FILEOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;END;2:BEGIN WRITE(LOGFILE,XCHR[S]);FILEOFFSET:=FILEOFFSET+1;
IF FILEOFFSET=MAXPRINTLINE THEN PRINTLN;END;1:BEGIN WRITE(TTY,XCHR[S]);
TERMOFFSET:=TERMOFFSET+1;IF TERMOFFSET=MAXPRINTLINE THEN PRINTLN;END;0:;
4:IF TALLY<TRICKCOUNT THEN TRICKBUF[TALLY MOD ERRORLINE]:=S;
5:BEGIN IF POOLPTR<POOLSIZE THEN BEGIN STRPOOL[POOLPTR]:=S;
POOLPTR:=POOLPTR+1;END;END;END;TALLY:=TALLY+1;END;{:58}{59:}
PROCEDURE PRINT(S:INTEGER);VAR J:POOLPOINTER;
BEGIN IF(S<0)OR(S>=STRPTR)THEN S:=131;J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN PRINTCHAR(STRPOOL[J]);J:=J+1;END;END;{:59}
{61:}PROCEDURE PRINTNL(S:STRNUMBER);
BEGIN IF((TERMOFFSET>0)AND(ODD(SELECTOR)))OR((FILEOFFSET>0)AND(SELECTOR
>=2))THEN PRINTLN;PRINT(S);END;{:61}{62:}
PROCEDURE PRINTTHEDIGS(K:EIGHTBITS);BEGIN WHILE K>0 DO BEGIN K:=K-1;
IF DIG[K]<10 THEN PRINTCHAR(48+DIG[K])ELSE PRINTCHAR(55+DIG[K]);END;END;
{:62}{63:}PROCEDURE PRINTINT(N:INTEGER);VAR K:0..23;M:INTEGER;
BEGIN K:=0;IF N<0 THEN BEGIN PRINTCHAR(45);
IF N>-100000000 THEN N:=-N ELSE BEGIN M:=-1-N;N:=M DIV 10;
M:=(M MOD 10)+1;K:=1;IF M<10 THEN DIG[0]:=M ELSE BEGIN DIG[0]:=0;N:=N+1;
END;END;END;REPEAT DIG[K]:=N MOD 10;N:=N DIV 10;K:=K+1;UNTIL N=0;
PRINTTHEDIGS(K);END;{:63}{100:}PROCEDURE PRINTSCALED(S:SCALED);
VAR DELTA:SCALED;BEGIN IF S<0 THEN BEGIN PRINTCHAR(45);S:=-S;END;
PRINTINT(S DIV 65536);S:=10*(S MOD 65536)+5;
IF S<>5 THEN BEGIN DELTA:=10;PRINTCHAR(46);
REPEAT IF DELTA>65536 THEN S:=S+32768-(DELTA DIV 2);
PRINTCHAR(48+(S DIV 65536));S:=10*(S MOD 65536);DELTA:=DELTA*10;
UNTIL S<=DELTA;END;END;{:100}{101:}PROCEDURE PRINTTWO(X,Y:SCALED);
BEGIN PRINTCHAR(40);PRINTSCALED(X);PRINTCHAR(44);PRINTSCALED(Y);
PRINTCHAR(41);END;{:101}{182:}PROCEDURE PRINTTYPE(T:SMALLNUMBER);
BEGIN CASE T OF 1:PRINT(197);2:PRINT(198);3:PRINT(199);4:PRINT(200);
5:PRINT(201);6:PRINT(202);7:PRINT(203);8:PRINT(204);9:PRINT(205);
10:PRINT(206);11:PRINT(207);12:PRINT(208);13:PRINT(209);14:PRINT(210);
15:PRINT(211);16:PRINT(212);17:PRINT(213);18:PRINT(214);19:PRINT(215);
20:PRINT(216);21:PRINT(217);22:PRINT(218);23:PRINT(219);24:PRINT(220);
OTHERS:PRINT(221)END;END;{:182}{189:}PROCEDURE BEGINDIAGNOS;
BEGIN OLDSETTING:=SELECTOR;IF HISTORY=0 THEN HISTORY:=1;
IF(INTERNAL[11]<=0)AND(SELECTOR=3)THEN SELECTOR:=SELECTOR-1;END;
PROCEDURE ENDDIAGNOSTI(BLANKLINE:BOOLEAN);BEGIN PRINTNL(312);
IF BLANKLINE THEN PRINTLN;SELECTOR:=OLDSETTING;END;{:189}{191:}
PROCEDURE PRINTDIAGNOS(S,T:STRNUMBER);BEGIN BEGINDIAGNOS;PRINTNL(S);
PRINT(313);PRINTINT(LINE);PRINT(T);PRINTCHAR(58);END;{:191}{718:}
PROCEDURE PRINTFILENAM(N,A,E:INTEGER);BEGIN PRINT(N);PRINT(E);PRINT(A);
END;{:718}{33:}FUNCTION INSKP0:BOOLEAN;EXTERN;PROCEDURE WAKEUPTERMIN;
VAR VAL:INTEGER;SUCCESS:BOOLEAN;BEGIN BEGIN IF INSKP0 THEN END;
ESCBREAK[1]:=536870912+ORD('N');CALLI(131153,-1,ESCBREAK,VAL,SUCCESS);
END;{:33}{72:}PROCEDURE NORMALIZESEL;FORWARD;PROCEDURE GETNEXT;FORWARD;
PROCEDURE TERMINPUT;FORWARD;PROCEDURE SHOWCONTEXT;FORWARD;
PROCEDURE BEGINFILEREA;FORWARD;PROCEDURE OPENLOGFILE;FORWARD;
PROCEDURE CLOSEFILESAN;FORWARD;PROCEDURE CLEARFORERRO;FORWARD;
PROCEDURE DEBUGHELP;FORWARD;{43:}PROCEDURE FLUSHSTRING(S:STRNUMBER);
BEGIN IF S<STRPTR-1 THEN STRREF[S]:=0 ELSE REPEAT STRPTR:=STRPTR-1;
UNTIL STRREF[STRPTR-1]<>0;POOLPTR:=STRSTART[STRPTR];END;{:43}{:72}{75:}
PROCEDURE JUMPOUT;BEGIN GOTO 9998;END;{:75}{76:}PROCEDURE ERROR;
LABEL 22,10;VAR C:ASCIICODE;S1,S2,S3:INTEGER;
BEGIN IF HISTORY<2 THEN HISTORY:=2;PRINTCHAR(46);SHOWCONTEXT;
IF INTERACTION=3 THEN{77:}WHILE TRUE DO BEGIN 22:CLEARFORERRO;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(135);TERMINPUT;END;
IF LAST=FIRST THEN GOTO 10;C:=BUFFER[FIRST];IF C>=97 THEN C:=C-32;{78:}
CASE C OF 49,50,51,52,53,54,55,56,57:IF DELETIONSALL THEN{82:}
BEGIN S1:=CURCMD;S2:=CURMOD;S3:=CURSYM;OKTOINTERRUP:=FALSE;
IF(LAST>FIRST+1)AND(BUFFER[FIRST+1]>=48)AND(BUFFER[FIRST+1]<=57)THEN C:=
C*10+BUFFER[FIRST+1]-48*11 ELSE C:=C-48;WHILE C>0 DO BEGIN GETNEXT;
{689:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:689}
;C:=C-1;END;CURCMD:=S1;CURMOD:=S2;CURSYM:=S3;OKTOINTERRUP:=TRUE;
BEGIN HELPPTR:=2;HELPLINE[1]:=150;HELPLINE[0]:=151;END;SHOWCONTEXT;
GOTO 22;END{:82};68:BEGIN DEBUGHELP;GOTO 22;END;
69,84:IF FILEPTR>0 THEN BEGIN SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];
PRINT(136);PRINT(INPUTSTACK[FILEPTR].NAMEFIELD);PRINTCHAR(47);
PRINTINT(PAGE);PRINT(137);PRINTINT(LINE);PRINTCHAR(108);PRINTCHAR(13);
IF STRPTR<MAXSTRINGS THEN BEGIN PSEUDOTYPEIN:=STRPTR;STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=POOLPTR;END;SELECTOR:=3;INTERACTION:=2;JUMPOUT;END;
72:{83:}BEGIN IF USEERRHELP THEN BEGIN PRINT(ERRHELP);USEERRHELP:=FALSE;
END ELSE BEGIN IF HELPPTR=0 THEN BEGIN HELPPTR:=2;HELPLINE[1]:=152;
HELPLINE[0]:=153;END;REPEAT HELPPTR:=HELPPTR-1;PRINT(HELPLINE[HELPPTR]);
PRINTLN;UNTIL HELPPTR=0;END;BEGIN HELPPTR:=4;HELPLINE[3]:=154;
HELPLINE[2]:=153;HELPLINE[1]:=155;HELPLINE[0]:=156;END;GOTO 22;END{:83};
73:{81:}BEGIN BEGINFILEREA;
IF LAST>FIRST+1 THEN BEGIN CURINPUT.LOCFIELD:=FIRST+1;BUFFER[FIRST]:=32;
END ELSE BEGIN BEGIN BEGIN IF INSKP0 THEN END;PRINT(149);TERMINPUT;END;
CURINPUT.LOCFIELD:=FIRST;END;FIRST:=LAST+1;CURINPUT.LIMITFIELD:=LAST;
GOTO 10;END{:81};81,82,83:{80:}BEGIN ERRORCOUNT:=0;INTERACTION:=0+C-81;
PRINT(144);CASE C OF 81:BEGIN PRINT(145);SELECTOR:=SELECTOR-1;END;
82:PRINT(146);83:PRINT(147);END;PRINT(148);PRINTLN;BREAK(TTY);GOTO 10;
END{:80};88:BEGIN INTERACTION:=2;JUMPOUT;END;OTHERS:END;{79:}
BEGIN PRINT(138);PRINTNL(139);PRINTNL(140);IF FILEPTR>0 THEN PRINT(141);
IF DELETIONSALL THEN PRINTNL(142);PRINTNL(143);END{:79}{:78};END{:77};
ERRORCOUNT:=ERRORCOUNT+1;IF ERRORCOUNT=100 THEN BEGIN PRINTNL(134);
HISTORY:=3;JUMPOUT;END;{84:}IF INTERACTION>0 THEN SELECTOR:=SELECTOR-1;
IF USEERRHELP THEN PRINTNL(ERRHELP)ELSE WHILE HELPPTR>0 DO BEGIN HELPPTR
:=HELPPTR-1;PRINTNL(HELPLINE[HELPPTR]);END;PRINTLN;
IF INTERACTION>0 THEN SELECTOR:=SELECTOR+1;PRINTLN{:84};10:END;{:76}
{86:}PROCEDURE FATALERROR(S:STRNUMBER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(157);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=S;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:86}{87:}
PROCEDURE OVERFLOW(S:STRNUMBER;N:INTEGER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(158);END;
PRINT(S);PRINTCHAR(61);PRINTINT(N);PRINTCHAR(93);BEGIN HELPPTR:=2;
HELPLINE[1]:=159;HELPLINE[0]:=160;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:87}{88:}
PROCEDURE CONFUSION(S:STRNUMBER);BEGIN NORMALIZESEL;
IF HISTORY<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(161);END;PRINT(S);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=162;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(163);END;BEGIN HELPPTR:=2;HELPLINE[1]:=164;HELPLINE[0]:=165;END;
END;BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:88}{:4}
{26:}FUNCTION ERSTAT(VAR F:FILE):INTEGER;EXTERN;
FUNCTION AOPENIN(VAR F:ALPHAFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/E/O/N:9');AOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION AOPENOUT(VAR F:ALPHAFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:2');AOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENIN(VAR F:BYTEFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/B:8/O/N:2');BOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');BOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION TFMBOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/B:8/O');TFMBOPENOUT:=ERSTAT(F)MOD 8192=0;
END;FUNCTION WOPENIN(VAR F:WORDFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/O/N:9');WOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION WOPENOUT(VAR F:WORDFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');WOPENOUT:=ERSTAT(F)MOD 8192=0;END;
{:26}{27:}PROCEDURE ACLOSE(VAR F:ALPHAFILE);BEGIN CLOSE(F);END;
PROCEDURE BCLOSE(VAR F:BYTEFILE);BEGIN CLOSE(F);END;
PROCEDURE WCLOSE(VAR F:WORDFILE);BEGIN CLOSE(F);END;{:27}{30:}
FUNCTION INPUTLN(VAR F:ALPHAFILE;BYPASSEOLN:BOOLEAN):BOOLEAN;LABEL 1,30;
VAR N:INTEGER;K,M:0..BUFSIZE;
BEGIN IF BYPASSEOLN THEN BEGIN IF NOT EOF(F)THEN GET(F);
IF NOT EOF(F)THEN IF F↑=CHR(10)THEN GET(F);END;LAST:=FIRST;
IF EOF(F)THEN INPUTLN:=FALSE ELSE BEGIN READ(F,AUXBUF:N);
IF BUFFER[FIRST]=12 THEN BEGIN PAGE:=PAGE+1;LINE:=1;END;
1:IF LAST+N>MAXBUFSTACK THEN IF LAST+N>=BUFSIZE THEN BEGIN MAXBUFSTACK:=
BUFSIZE;OVERFLOW(128,BUFSIZE);END ELSE MAXBUFSTACK:=LAST+N;
IF N>0 THEN BEGIN M:=LAST;IF N=72 THEN LAST:=M+71 ELSE LAST:=M+N;
FOR K:=M TO LAST-1 DO BUFFER[K]:=XORD[AUXBUF[K-M]];
IF N=72 THEN BEGIN READ(F,AUXBUF:N);GOTO 1;END;
END ELSE IF F↑=CHR(12)THEN BEGIN AUXBUF[0]:=F↑;N:=1;GOTO 1;END;
WHILE TRUE DO BEGIN IF LAST=FIRST THEN GOTO 30;
IF BUFFER[LAST-1]<>32 THEN GOTO 30;LAST:=LAST-1;END;30:INPUTLN:=TRUE;
END;END;{:30}{36:}PROCEDURE ESCI(VAR X:INTEGER);EXTERN;
FUNCTION RESCAN:BOOLEAN;EXTERN;FUNCTION TMPIN(F:STRING;
VAR S:STRING):INTEGER;EXTERN;FUNCTION CCLSW:BOOLEAN;EXTERN;
PROCEDURE PTWR1W(PTY,C:INTEGER);EXTERN;FUNCTION INITTERMINAL:BOOLEAN;
LABEL 10;VAR L:INTEGER;LINEFOUND:BOOLEAN;
TMPCORBUF:PACKED ARRAY[0..100]OF CHAR;BEGIN;ESCI(INTERRUPT);LAST:=FIRST;
IF CCLSW THEN BEGIN L:=TMPIN('MF',TMPCORBUF);CURINPUT.LOCFIELD:=1;
WHILE(CURINPUT.LOCFIELD<L)AND(TMPCORBUF[CURINPUT.LOCFIELD]<>'←')DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
WHILE CURINPUT.LOCFIELD<L DO BEGIN IF TMPCORBUF[CURINPUT.LOCFIELD]>' '
THEN BEGIN BUFFER[LAST]:=XORD[TMPCORBUF[CURINPUT.LOCFIELD]];
LAST:=LAST+1;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
END ELSE IF FALSE THEN IF RESCAN THEN BEGIN READLN(TTY);
WHILE(NOT EOLN(TTY))AND(TTY↑<>';')DO GET(TTY);
IF TTY↑=';'THEN BEGIN GET(TTY);
WHILE NOT EOLN(TTY)DO BEGIN BUFFER[LAST]:=XORD[TTY↑];LAST:=LAST+1;
GET(TTY);END;END;END;LINEFOUND:=(LAST>FIRST);
WHILE TRUE DO BEGIN CURINPUT.LOCFIELD:=FIRST;
WHILE(CURINPUT.LOCFIELD<LAST)AND(BUFFER[CURINPUT.LOCFIELD]=32)DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
IF CURINPUT.LOCFIELD<LAST THEN BEGIN INITTERMINAL:=TRUE;GOTO 10;END;
IF LINEFOUND THEN WRITELN(TTY,'Please type the name of your input file.'
);WAKEUPTERMIN;WRITE(TTY,'**');BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! End of file on the terminal... why?');INITTERMINAL:=FALSE;
GOTO 10;END;LINEFOUND:=TRUE;END;10:END;{:36}{44:}
FUNCTION MAKESTRING:STRNUMBER;
BEGIN IF STRPTR=MAXSTRINGS THEN OVERFLOW(130,MAXSTRINGS-INITSTRPTR);
STRREF[STRPTR]:=1;STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
MAKESTRING:=STRPTR-1;END;{:44}{45:}FUNCTION STREQBUF(S:STRNUMBER;
K:INTEGER):BOOLEAN;LABEL 45;VAR J:POOLPOINTER;RESULT:BOOLEAN;
BEGIN J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN IF STRPOOL[J]<>BUFFER[K]THEN BEGIN RESULT
:=FALSE;GOTO 45;END;J:=J+1;K:=K+1;END;RESULT:=TRUE;45:STREQBUF:=RESULT;
END;{:45}{46:}FUNCTION STRVSSTR(S,T:STRNUMBER):INTEGER;LABEL 10;
VAR J,K:POOLPOINTER;LS,LT:INTEGER;L:INTEGER;
BEGIN LS:=(STRSTART[S+1]-STRSTART[S]);LT:=(STRSTART[T+1]-STRSTART[T]);
IF LS<=LT THEN L:=LS ELSE L:=LT;J:=STRSTART[S];K:=STRSTART[T];
WHILE L>0 DO BEGIN IF STRPOOL[J]<>STRPOOL[K]THEN BEGIN STRVSSTR:=STRPOOL
[J]-STRPOOL[K];GOTO 10;END;J:=J+1;K:=K+1;L:=L-1;END;STRVSSTR:=LS-LT;
10:END;{:46}{47:}FUNCTION GETSTRINGSST:BOOLEAN;LABEL 30,10;
VAR K,L:0..127;M,N:CHAR;G:STRNUMBER;A:INTEGER;C:BOOLEAN;
BEGIN POOLPTR:=0;STRPTR:=0;STRSTART[0]:=0;{48:}
FOR K:=0 TO 127 DO BEGIN IF({49:}(K=127)OR(K IN[0,9..13,27]){:49}
)THEN BEGIN BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
IF K<64 THEN BEGIN STRPOOL[POOLPTR]:=K+64;POOLPTR:=POOLPTR+1;
END ELSE BEGIN STRPOOL[POOLPTR]:=K-64;POOLPTR:=POOLPTR+1;END;
END ELSE BEGIN STRPOOL[POOLPTR]:=K;POOLPTR:=POOLPTR+1;END;G:=MAKESTRING;
STRREF[G]:=127;END{:48};{51:}NAMEOFFILE:=POOLNAME;
IF AOPENIN(POOLFILE)THEN BEGIN C:=FALSE;REPEAT{52:}
BEGIN IF EOF(POOLFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL has no check sum.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;READ(POOLFILE,M,N);IF M='*'THEN{53:}
BEGIN A:=0;K:=1;
WHILE TRUE DO BEGIN IF(XORD[N]<48)OR(XORD[N]>57)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL check sum doesn''t have nine digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;A:=10*A+XORD[N]-48;
IF K=9 THEN GOTO 30;K:=K+1;READ(POOLFILE,N);END;
30:IF A<>125221776 THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL doesn''t match; TANGLE me again.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;C:=TRUE;END{:53}
ELSE BEGIN IF(XORD[M]<48)OR(XORD[M]>57)OR(XORD[N]<48)OR(XORD[N]>57)THEN
BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL line doesn''t begin with two digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;
L:=XORD[M]*10+XORD[N]-48*11;
IF POOLPTR+L+STRINGVACANC>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! You have to increase POOLSIZE.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;
FOR K:=1 TO L DO BEGIN IF EOLN(POOLFILE)THEN M:=' 'ELSE READ(POOLFILE,M)
;BEGIN STRPOOL[POOLPTR]:=XORD[M];POOLPTR:=POOLPTR+1;END;END;
READLN(POOLFILE);G:=MAKESTRING;STRREF[G]:=127;END;END{:52};UNTIL C;
ACLOSE(POOLFILE);GETSTRINGSST:=TRUE;END ELSE BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! I can''t read MF.POOL.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END{:51};10:END;{:47}{64:}
PROCEDURE PRINTDD(N:INTEGER);BEGIN N:=ABS(N)MOD 100;
PRINTCHAR(48+(N DIV 10));PRINTCHAR(48+(N MOD 10));END;{:64}{65:}
PROCEDURE TERMINPUT;VAR K:0..BUFSIZE;BEGIN BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);TERMOFFSET:=0;
SELECTOR:=SELECTOR-1;
IF LAST<>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINT(BUFFER[K]);PRINTLN;
BUFFER[LAST]:=37;SELECTOR:=SELECTOR+1;END;{:65}{85:}
PROCEDURE NORMALIZESEL;
BEGIN IF JOBNAME>0 THEN SELECTOR:=3 ELSE SELECTOR:=1;
IF INTERACTION=0 THEN SELECTOR:=SELECTOR-1;
IF JOBNAME=0 THEN OPENLOGFILE;END;{:85}{91:}PROCEDURE PAUSEFORINST;
BEGIN IF OKTOINTERRUP THEN BEGIN INTERACTION:=3;
IF(SELECTOR=2)OR(SELECTOR=0)THEN SELECTOR:=SELECTOR+1;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(166);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=167;HELPLINE[1]:=168;HELPLINE[0]:=169;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;INTERRUPT:=0;END;END;{:91}
{92:}PROCEDURE MISSINGERR(S:STRNUMBER);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(170);
END;PRINT(S);PRINT(171);END;{:92}{97:}PROCEDURE CLEARARITH;
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(172);
END;BEGIN HELPPTR:=4;HELPLINE[3]:=173;HELPLINE[2]:=174;HELPLINE[1]:=175;
HELPLINE[0]:=176;END;ERROR;ARITHERROR:=FALSE;END;{:97}{99:}
FUNCTION ROUNDDECIMAL(K:SMALLNUMBER):SCALED;VAR A:INTEGER;BEGIN A:=0;
WHILE K>0 DO BEGIN K:=K-1;A:=(A+DIG[K]*131072)DIV 10;END;
ROUNDDECIMAL:=(A+1)DIV 2;END;{:99}{104:}
FUNCTION MAKEFRACTION(P,Q:INTEGER):FRACTION;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<=0 THEN BEGIN IF Q=0 THEN CONFUSION(47);Q:=-Q;
NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;P:=P MOD Q;
IF N<8 THEN N:=(N-1)*268435456 ELSE BEGIN ARITHERROR:=TRUE;
N:=1610612736;END;{105:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=268435456;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:105};
IF NEGATIVE THEN MAKEFRACTION:=-(F+N)ELSE MAKEFRACTION:=F+N;END;{:104}
{106:}FUNCTION TAKEFRACTION(Q:INTEGER;F:FRACTION):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<268435456 THEN N:=0 ELSE BEGIN N:=F DIV 268435456;
F:=F MOD 268435456;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+268435456;{108:}P:=134217728;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:108};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKEFRACTION:=-(N+P)ELSE TAKEFRACTION:=N+P;END;{:106}
{109:}FUNCTION TAKESCALED(Q:INTEGER;F:SCALED):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<65536 THEN N:=0 ELSE BEGIN N:=F DIV 65536;F:=F MOD 65536;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+65536;{110:}P:=32768;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:110};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKESCALED:=-(N+P)ELSE TAKESCALED:=N+P;END;{:109}{111:}
FUNCTION MAKESCALED(P,Q:INTEGER):SCALED;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;
P:=P MOD Q;IF N<32768 THEN N:=(N-1)*65536 ELSE BEGIN ARITHERROR:=TRUE;
N:=2147352576;END;{112:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=65536;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:112};
IF NEGATIVE THEN MAKESCALED:=-(F+N)ELSE MAKESCALED:=F+N;END;{:111}{113:}
FUNCTION VELOCITY(ST,CT,SF,CF:FRACTION;T:SCALED):FRACTION;
VAR ACC,NUM,DENOM:INTEGER;
BEGIN ACC:=TAKEFRACTION(ST-(SF DIV 16),SF-(ST DIV 16));
ACC:=TAKEFRACTION(ACC,CT-CF);NUM:=536870912+TAKEFRACTION(ACC,379625062);
DENOM:=805306368+TAKEFRACTION(CT,497706707)+TAKEFRACTION(CF,307599661);
IF T<>65536 THEN NUM:=MAKESCALED(NUM,T);
IF NUM DIV 4>=DENOM THEN VELOCITY:=1073741824 ELSE VELOCITY:=
MAKEFRACTION(NUM,DENOM);END;{:113}{114:}
FUNCTION ABVSCD(A,B,C,D:INTEGER):INTEGER;LABEL 10;VAR Q,R:INTEGER;
BEGIN{115:}IF A<0 THEN BEGIN A:=-A;B:=-B;END;IF C<0 THEN BEGIN C:=-C;
D:=-D;END;
IF D<=0 THEN BEGIN IF B>=0 THEN IF((A=0)OR(B=0))AND((C=0)OR(D=0))THEN
BEGIN ABVSCD:=0;GOTO 10;END ELSE BEGIN ABVSCD:=1;GOTO 10;END;
IF D=0 THEN IF A=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A;A:=C;C:=Q;Q:=-B;B:=-D;D:=Q;
END ELSE IF B<=0 THEN BEGIN IF B<0 THEN IF A>0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;IF C=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;END{:115};
WHILE TRUE DO BEGIN Q:=A DIV D;R:=C DIV B;
IF Q<>R THEN IF Q>R THEN BEGIN ABVSCD:=1;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A MOD D;R:=C MOD B;
IF R=0 THEN IF Q=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=1;GOTO 10;END;IF Q=0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;A:=B;B:=Q;C:=D;D:=R;END;10:END;{:114}{116:}
FUNCTION ROUNDSCALED(X:SCALED):SCALED;
BEGIN IF X>=0 THEN ROUNDSCALED:=65536*((X+32768)DIV 65536)ELSE
ROUNDSCALED:=-65536*((-X+32767)DIV 65536);END;
FUNCTION ROUNDUNSCALE(X:SCALED):INTEGER;
BEGIN IF X>=0 THEN ROUNDUNSCALE:=(X+32768)DIV 65536 ELSE ROUNDUNSCALE:=-
((-X+32767)DIV 65536);END;FUNCTION FLOORSCALED(X:SCALED):SCALED;
BEGIN IF X>=0 THEN FLOORSCALED:=65536*(X DIV 65536)ELSE FLOORSCALED:=
-65536*((-X+65535)DIV 65536);END;
FUNCTION FLOORUNSCALE(X:SCALED):INTEGER;
BEGIN IF X>=0 THEN FLOORUNSCALE:=X DIV 65536 ELSE FLOORUNSCALE:=-((-X
+65535)DIV 65536);END;FUNCTION ROUNDFRACTIO(X:FRACTION):SCALED;
BEGIN IF X>=0 THEN ROUNDFRACTIO:=(X+2048)DIV 4096 ELSE ROUNDFRACTIO:=-((
-X+2047)DIV 4096);END;{:116}{118:}FUNCTION SQUARERT(X:SCALED):SCALED;
VAR K:SMALLNUMBER;Y,Q:INTEGER;BEGIN IF X<=0 THEN{119:}
BEGIN IF X<0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(177);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=179;HELPLINE[0]:=180;END;ERROR;END;SQUARERT:=0;END{:119}
ELSE BEGIN K:=23;Q:=2;WHILE X<536870912 DO BEGIN K:=K-1;X:=X+X+X+X;END;
IF X<1073741824 THEN Y:=0 ELSE BEGIN X:=X-1073741824;Y:=1;END;
REPEAT{120:}X:=X+X;Y:=Y+Y;IF X>=1073741824 THEN BEGIN X:=X-1073741824;
Y:=Y+1;END;X:=X+X;Y:=Y+Y-Q;Q:=Q+Q;
IF X>=1073741824 THEN BEGIN X:=X-1073741824;Y:=Y+1;END;
IF Y>Q THEN BEGIN Y:=Y-Q;Q:=Q+2;END ELSE IF Y<=0 THEN BEGIN Q:=Q-2;
Y:=Y+Q;END;K:=K-1{:120};UNTIL K=0;SQUARERT:=(Q)DIV 2;END;END;{:118}
{121:}FUNCTION PYTHADD(A,B:INTEGER):INTEGER;LABEL 30;VAR R:FRACTION;
BIG:BOOLEAN;BEGIN A:=ABS(A);B:=ABS(B);IF A<B THEN BEGIN R:=B;B:=A;A:=R;
END;
IF A>0 THEN BEGIN IF A<536870912 THEN BIG:=FALSE ELSE BEGIN A:=(A+2)DIV
4;B:=(B+2)DIV 4;BIG:=TRUE;END;{122:}
WHILE TRUE DO BEGIN R:=MAKEFRACTION(B,A);R:=TAKEFRACTION(R,R);
IF R=0 THEN GOTO 30;R:=MAKEFRACTION(R,1073741824+R);
A:=A+TAKEFRACTION(A+A,R);B:=TAKEFRACTION(B,R);END;30:{:122};
IF BIG THEN IF A<536870912 THEN A:=A+A+A+A ELSE BEGIN ARITHERROR:=TRUE;
A:=2147483647;END;END;PYTHADD:=A;END;{:121}{126:}
FUNCTION MLOG(X:SCALED):SCALED;VAR Y,Z:INTEGER;K:INTEGER;
BEGIN IF X<=0 THEN{128:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(181);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=182;HELPLINE[0]:=180;END;ERROR;MLOG:=0;END{:128}
ELSE BEGIN Y:=1302456860;Z:=6581195;WHILE X<1073741824 DO BEGIN X:=X+X;
Y:=Y-93032639;Z:=Z-48782;END;Y:=Y+(Z DIV 65536);K:=2;
WHILE X>1073741828 DO{127:}BEGIN Z:=((X-1)DIV TWOTOTHE[K])+1;
WHILE X<1073741824+Z DO BEGIN Z:=(Z+1)DIV 2;K:=K+1;END;Y:=Y+SPECLOG[K];
X:=X-Z;END{:127};MLOG:=Y DIV 8;END;END;{:126}{129:}
FUNCTION MEXP(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Z:INTEGER;
BEGIN IF X>174436200 THEN BEGIN ARITHERROR:=TRUE;MEXP:=2147483647;
END ELSE IF X<-197694359 THEN MEXP:=0 ELSE BEGIN IF X<=0 THEN BEGIN Z:=
-8*X;Y:=1048576;
END ELSE BEGIN IF X<=127919879 THEN Z:=1023359037-8*X ELSE Z:=8*(
174436200-X);Y:=2147483647;END;{130:}K:=1;
WHILE Z>0 DO BEGIN WHILE Z>=SPECLOG[K]DO BEGIN Z:=Z-SPECLOG[K];
Y:=Y-1-((Y-TWOTOTHE[K-1])DIV TWOTOTHE[K]);END;K:=K+1;END{:130};
IF X<=127919879 THEN MEXP:=(Y+8)DIV 16 ELSE MEXP:=Y;END;END;{:129}{133:}
FUNCTION NARG(X,Y:INTEGER):ANGLE;VAR Z:ANGLE;T:INTEGER;K:SMALLNUMBER;
OCTANT:1..8;BEGIN IF X>=0 THEN OCTANT:=1 ELSE BEGIN X:=-X;OCTANT:=2;END;
IF Y<0 THEN BEGIN Y:=-Y;OCTANT:=OCTANT+2;END;IF X<Y THEN BEGIN T:=Y;
Y:=X;X:=T;OCTANT:=OCTANT+4;END;IF X=0 THEN{134:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(183);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=184;HELPLINE[0]:=180;END;ERROR;
NARG:=0;END{:134}ELSE BEGIN{136:}
WHILE X>=536870912 DO BEGIN X:=(X)DIV 2;Y:=(Y)DIV 2;END;Z:=0;
IF Y>0 THEN BEGIN WHILE X<268435456 DO BEGIN X:=X+X;Y:=Y+Y;END;{137:}
K:=0;REPEAT Y:=Y+Y;K:=K+1;IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];T:=X;
X:=X+(Y DIV TWOTOTHE[K+K]);Y:=Y-T;END;UNTIL K=15;REPEAT Y:=Y+Y;K:=K+1;
IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];Y:=Y-X;END;UNTIL K=26{:137};END{:136}
;{135:}CASE OCTANT OF 1:NARG:=Z;5:NARG:=94371840-Z;6:NARG:=94371840+Z;
2:NARG:=188743680-Z;4:NARG:=Z-188743680;8:NARG:=-Z-94371840;
7:NARG:=Z-94371840;3:NARG:=-Z;END{:135};END;END;{:133}{139:}
PROCEDURE NSINCOS(Z:ANGLE);VAR K:SMALLNUMBER;Q:0..7;R:FRACTION;
X,Y,T:INTEGER;BEGIN WHILE Z<0 DO Z:=Z+377487360;Z:=Z MOD 377487360;
Q:=Z DIV 47185920;Z:=Z MOD 47185920;X:=268435456;Y:=X;
IF NOT ODD(Q)THEN Z:=47185920-Z;{141:}K:=1;
WHILE Z>0 DO BEGIN IF Z>=SPECATAN[K]THEN BEGIN Z:=Z-SPECATAN[K];T:=X;
X:=T+Y DIV TWOTOTHE[K];Y:=Y-T DIV TWOTOTHE[K];END;K:=K+1;END;
IF Y<0 THEN Y:=0{:141};{140:}CASE Q OF 0:;1:BEGIN T:=X;X:=Y;Y:=T;END;
2:BEGIN T:=X;X:=-Y;Y:=T;END;3:X:=-X;4:BEGIN X:=-X;Y:=-Y;END;
5:BEGIN T:=X;X:=-Y;Y:=-T;END;6:BEGIN T:=X;X:=Y;Y:=-T;END;7:Y:=-Y;
END{:140};R:=PYTHADD(X,Y);NCOS:=MAKEFRACTION(X,R);
NSIN:=MAKEFRACTION(Y,R);END;{:139}{143:}PROCEDURE NEWRANDOMS;
VAR K:0..54;X:FRACTION;
BEGIN FOR K:=0 TO 23 DO BEGIN X:=RANDOMS[K]-RANDOMS[K+31];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;
FOR K:=24 TO 54 DO BEGIN X:=RANDOMS[K]-RANDOMS[K-24];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;JRANDOM:=54;END;{:143}
{144:}PROCEDURE INITRANDOMS(SEED:SCALED);VAR J,JJ,K:FRACTION;I:0..54;
BEGIN J:=ABS(SEED);WHILE J>=268435456 DO J:=(J)DIV 2;K:=1;
FOR I:=0 TO 54 DO BEGIN JJ:=K;K:=J-K;J:=JJ;IF K<0 THEN K:=K+268435456;
RANDOMS[(I*21)MOD 55]:=J;END;NEWRANDOMS;NEWRANDOMS;NEWRANDOMS;END;{:144}
{145:}FUNCTION UNIFRAND(X:SCALED):SCALED;VAR Y:SCALED;
BEGIN IF X<=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(185);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=186;HELPLINE[0]:=180;END;ERROR;UNIFRAND:=0;
END ELSE BEGIN IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
Y:=TAKEFRACTION(X,RANDOMS[JRANDOM]);
IF Y=X THEN UNIFRAND:=0 ELSE UNIFRAND:=Y;END;END;{:145}{146:}
FUNCTION NORMRAND:SCALED;VAR X,U,L:INTEGER;
BEGIN REPEAT REPEAT IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1
;X:=TAKEFRACTION(112429,RANDOMS[JRANDOM]-134217728);
IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
U:=RANDOMS[JRANDOM];UNTIL ABS(X)<U;X:=MAKEFRACTION(X,U);
L:=139548960-MLOG(U);UNTIL ABVSCD(1024,L,X,X)>=0;NORMRAND:=X;END;{:146}
{151:}PROCEDURE PRINTWORD(W:MEMORYWORD);BEGIN PRINTINT(W.INT);
PRINTCHAR(32);PRINTSCALED(W.INT);PRINTCHAR(32);
PRINTSCALED(W.INT DIV 4096);PRINTLN;PRINTINT(W.HH.LH);PRINTCHAR(61);
PRINTINT(W.HH.B0);PRINTCHAR(58);PRINTINT(W.HH.B1);PRINTCHAR(59);
PRINTINT(W.HH.RH);PRINTCHAR(32);PRINTINT(W.QQQQ.B0);PRINTCHAR(58);
PRINTINT(W.QQQQ.B1);PRINTCHAR(58);PRINTINT(W.QQQQ.B2);PRINTCHAR(58);
PRINTINT(W.QQQQ.B3);END;{:151}{156:}{211:}
PROCEDURE SHOWTOKENLIS(P,Q:INTEGER;L:INTEGER);LABEL 10;
VAR CLASS,C:SMALLNUMBER;R,V:INTEGER;BEGIN CLASS:=3;TALLY:=0;
WHILE(P<>0)AND(TALLY<L)DO BEGIN IF P=Q THEN{594:}
BEGIN FIRSTCOUNT:=TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END{:594};{212:}C:=9;
IF(P<27)OR(P>MEMEND)THEN BEGIN PRINT(350);GOTO 10;END;
IF P<26000 THEN{213:}IF MEM[P].HH.LH=41 THEN{214:}
BEGIN IF CLASS=0 THEN PRINTCHAR(32);V:=MEM[P+1].INT;
IF V<0 THEN BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINTCHAR(91);
PRINTSCALED(V);PRINTCHAR(93);C:=18;END ELSE BEGIN PRINTSCALED(V);C:=0;
END;END{:214}
ELSE IF MEM[P].HH.LH<>40 THEN PRINT(353)ELSE BEGIN PRINTCHAR(34);
PRINT(MEM[P+1].INT);PRINTCHAR(34);C:=4;END{:213}
ELSE BEGIN R:=MEM[P].HH.LH;IF R>=2244 THEN{216:}
BEGIN IF R<2544 THEN BEGIN PRINT(355);R:=R-(2394);
END ELSE IF R<2694 THEN BEGIN PRINT(356);R:=R-(2544);
END ELSE BEGIN PRINT(357);R:=R-(2694);END;PRINTINT(R);PRINTCHAR(41);
C:=0;END{:216}ELSE IF R<1 THEN IF R=0 THEN{215:}
BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINT(354);C:=18;END{:215}
ELSE PRINT(351)ELSE BEGIN R:=HASH[R].RH;
IF(R<0)OR(R>=STRPTR)THEN PRINT(352)ELSE{217:}
BEGIN C:=CHARCLASS[STRPOOL[STRSTART[R]]];
IF C=CLASS THEN CASE C OF 9:PRINTCHAR(46);5,6,7,8:;
OTHERS:PRINTCHAR(32)END;PRINT(R);END{:217};END;END{:212};CLASS:=C;
P:=MEM[P].HH.RH;END;IF P<>0 THEN PRINT(349);10:END;{:211}{613:}
PROCEDURE RUNAWAY;BEGIN IF SCANNERSTATU>2 THEN BEGIN PRINTNL(482);
CASE SCANNERSTATU OF 3:PRINT(483);4,5:PRINT(484);6:PRINT(485);END;
PRINTLN;SHOWTOKENLIS(MEM[26001].HH.RH,0,ERRORLINE-10);END;END;{:613}
{:156}{157:}FUNCTION GETAVAIL:HALFWORD;VAR P:HALFWORD;BEGIN P:=AVAIL;
IF P<>0 THEN AVAIL:=MEM[AVAIL].HH.RH ELSE IF MEMEND<MEMMAX THEN BEGIN
MEMEND:=MEMEND+1;P:=MEMEND;END ELSE BEGIN RUNAWAY;
OVERFLOW(187,MEMMAX-25999);END;MEM[P].HH.RH:=0;DYNUSED:=DYNUSED+1;
GETAVAIL:=P;END;{:157}{161:}FUNCTION GETNODE(S:INTEGER):HALFWORD;
LABEL 40,10;VAR P:HALFWORD;Q:HALFWORD;R:INTEGER;T:HALFWORD;
BEGIN P:=ROVER;REPEAT{162:}Q:=P+MEM[P].HH.LH;
WHILE(MEM[Q].HH.RH=262143)DO{163:}BEGIN T:=MEM[Q+1].HH.RH;
IF Q=ROVER THEN ROVER:=T;MEM[T+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH+1].HH.RH:=T;Q:=Q+MEM[Q].HH.LH;END{:163};R:=Q-S;
IF R>P+1 THEN{164:}BEGIN MEM[P].HH.LH:=R-P;ROVER:=P;GOTO 40;END{:164};
IF R=P THEN IF((MEM[P+1].HH.RH<>ROVER)OR(MEM[P+1].HH.LH<>ROVER))THEN{165
:}BEGIN ROVER:=MEM[P+1].HH.RH;T:=MEM[P+1].HH.LH;MEM[ROVER+1].HH.LH:=T;
MEM[T+1].HH.RH:=ROVER;GOTO 40;END{:165};MEM[P].HH.LH:=Q-P{:162};
P:=MEM[P+1].HH.RH;UNTIL P=ROVER;
IF S=1073741824 THEN BEGIN GETNODE:=262143;GOTO 10;END;
OVERFLOW(188,26000);40:MEM[R].HH.RH:=0;VARUSED:=VARUSED+S;
IF VARUSED>MAXVARUSED THEN MAXVARUSED:=VARUSED;GETNODE:=R;10:END;{:161}
{166:}PROCEDURE FREENODE(P:HALFWORD;S:HALFWORD);VAR Q:HALFWORD;
BEGIN IF{169:}(P<27)OR(P>=26000){:169}THEN CONFUSION(189);
MEM[P].HH.LH:=S;MEM[P].HH.RH:=262143;Q:=MEM[ROVER+1].HH.LH;
MEM[P+1].HH.LH:=Q;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;
MEM[Q+1].HH.RH:=P;VARUSED:=VARUSED-S;END;{:166}{167:}
PROCEDURE SORTAVAIL;VAR P,Q,R:HALFWORD;OLDROVER:HALFWORD;
BEGIN P:=GETNODE(1073741824);P:=MEM[ROVER+1].HH.RH;
MEM[ROVER+1].HH.RH:=262143;OLDROVER:=ROVER;WHILE P<>OLDROVER DO{168:}
IF P<ROVER THEN BEGIN Q:=P;P:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=ROVER;
ROVER:=Q;END ELSE BEGIN Q:=ROVER;
WHILE MEM[Q+1].HH.RH<P DO Q:=MEM[Q+1].HH.RH;R:=MEM[P+1].HH.RH;
MEM[P+1].HH.RH:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=P;P:=R;END{:168};
P:=ROVER;
WHILE MEM[P+1].HH.RH<>262143 DO BEGIN MEM[MEM[P+1].HH.RH+1].HH.LH:=P;
P:=MEM[P+1].HH.RH;END;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;END;
{:167}{172:}PROCEDURE FLUSHLIST(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P>=26004 DO BEGIN Q:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;P:=Q;END;END;
PROCEDURE FLUSHNODELIS(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q<26000 THEN FREENODE(Q,2)ELSE BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;
DYNUSED:=DYNUSED-1;END;END;END;{:172}{175:}
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);LABEL 31,32;VAR P,Q:HALFWORD;
CLOBBERED:BOOLEAN;BEGIN FOR P:=0 TO MEMEND DO FREE[P]:=FALSE;{176:}
P:=AVAIL;Q:=0;CLOBBERED:=FALSE;
WHILE P<>0 DO BEGIN IF(P>MEMEND)OR(P<26004)THEN CLOBBERED:=TRUE ELSE IF
FREE[P]THEN CLOBBERED:=TRUE;IF CLOBBERED THEN BEGIN PRINTNL(190);
PRINTINT(Q);GOTO 31;END;FREE[P]:=TRUE;Q:=P;P:=MEM[Q].HH.RH;END;31:{:176}
;{177:}P:=ROVER;Q:=0;CLOBBERED:=FALSE;
REPEAT IF(P>=26000)OR(P<27)THEN CLOBBERED:=TRUE ELSE IF(MEM[P+1].HH.RH>=
26000)OR(MEM[P+1].HH.RH<27)THEN CLOBBERED:=TRUE ELSE IF NOT((MEM[P].HH.
RH=262143))OR(MEM[P].HH.LH<2)OR(P+MEM[P].HH.LH>26000)OR(MEM[MEM[P+1].HH.
RH+1].HH.LH<>P)THEN CLOBBERED:=TRUE;
IF CLOBBERED THEN BEGIN PRINTNL(191);PRINTINT(Q);GOTO 32;END;
FOR Q:=P TO P+MEM[P].HH.LH-1 DO BEGIN IF FREE[Q]THEN BEGIN PRINTNL(192);
PRINTINT(Q);GOTO 32;END;FREE[Q]:=TRUE;END;Q:=P;P:=MEM[P+1].HH.RH;
UNTIL P=ROVER;32:{:177};{178:}P:=0;
WHILE P<=26000 DO BEGIN IF(MEM[P].HH.RH=262143)THEN BEGIN PRINTNL(193);
PRINTINT(P);END;WHILE(P<=26000)AND NOT FREE[P]DO P:=P+1;
WHILE(P<=26000)AND FREE[P]DO P:=P+1;END{:178};IF PRINTLOCS THEN{179:}
BEGIN PRINTNL(194);
FOR P:=0 TO MEMEND DO IF NOT FREE[P]AND((P>WASMEMEND)OR WASFREE[P])THEN
BEGIN PRINTCHAR(32);PRINTINT(P);END;END{:179};
FOR P:=0 TO MEMEND DO WASFREE[P]:=FREE[P];WASMEMEND:=MEMEND;END;{:175}
{180:}PROCEDURE SEARCHMEM(P:HALFWORD);VAR Q:INTEGER;
BEGIN FOR Q:=0 TO MEMEND DO BEGIN IF MEM[Q].HH.RH=P THEN BEGIN PRINTNL(
195);PRINTINT(Q);PRINTCHAR(41);END;
IF MEM[Q].HH.LH=P THEN BEGIN PRINTNL(196);PRINTINT(Q);PRINTCHAR(41);END;
END;{203:}
FOR Q:=1 TO 2243 DO BEGIN IF EQTB[Q].RH=P THEN BEGIN PRINTNL(322);
PRINTINT(Q);PRINTCHAR(41);END;END{:203};END;{:180}{183:}
PROCEDURE PRINTOP(C:QUARTERWORD);
BEGIN IF C<=19 THEN PRINTTYPE(C)ELSE CASE C OF 30:PRINT(222);
31:PRINT(223);32:PRINT(224);33:PRINT(225);34:PRINT(226);35:PRINT(227);
36:PRINT(228);37:PRINT(229);38:PRINT(230);39:PRINT(212);40:PRINT(231);
41:PRINT(232);42:PRINT(233);43:PRINT(234);44:PRINT(235);45:PRINT(236);
46:PRINT(237);47:PRINT(238);48:PRINT(239);49:PRINT(240);50:PRINT(241);
51:PRINT(242);52:PRINT(243);53:PRINT(244);54:PRINT(245);55:PRINT(246);
56:PRINT(247);57:PRINT(248);58:PRINT(249);59:PRINT(250);60:PRINT(251);
61:PRINT(252);62:PRINT(253);63:PRINT(254);64:PRINT(255);
65:PRINTCHAR(43);66:PRINTCHAR(45);67:PRINTCHAR(42);68:PRINTCHAR(47);
69:PRINT(256);71:PRINT(257);70:PRINT(258);72:PRINTCHAR(60);
73:PRINT(259);74:PRINTCHAR(62);75:PRINT(260);76:PRINTCHAR(61);
77:PRINT(261);90:PRINT(262);91:PRINT(263);92:PRINT(264);93:PRINT(265);
94:PRINT(266);95:PRINT(267);96:PRINT(268);78:PRINT(38);79:PRINT(269);
80:PRINT(270);81:PRINT(271);82:PRINT(272);83:PRINT(273);84:PRINT(274);
85:PRINT(275);86:PRINT(276);87:PRINT(277);88:PRINT(278);
OTHERS:PRINT(279)END;END;{:183}{188:}PROCEDURE FIXDATEANDTI;
VAR T:INTEGER;DATE:INTEGER;G:BOOLEAN;BEGIN CALLI(131137,,T,T,G);
DATE:=T DIV 262144;INTERNAL[15]:=((T MOD 262144)DIV 60)*65536;
INTERNAL[14]:=((DATE MOD 31)+1)*65536;
INTERNAL[13]:=(((DATE DIV 31)MOD 12)+1)*65536;
INTERNAL[12]:=((DATE DIV(31*12))+1964)*65536;
IF INTERNAL[13]=262144 THEN IF INTERNAL[14]=65536 THEN WRITELN(TTY,
'Hello! I am your user-friendly MF System.');END;{:188}{199:}
FUNCTION IDLOOKUP(J,L:INTEGER):HALFWORD;LABEL 40;VAR H:INTEGER;
P:HALFWORD;K:HALFWORD;BEGIN IF L=1 THEN{200:}BEGIN P:=BUFFER[J]+1;
HASH[P].RH:=P-1;GOTO 40;END{:200};{202:}H:=BUFFER[J];
FOR K:=J+1 TO J+L-1 DO BEGIN H:=H+H+BUFFER[K];
WHILE H>=1777 DO H:=H-1777;END{:202};P:=H+129;
WHILE TRUE DO BEGIN IF HASH[P].RH>0 THEN IF(STRSTART[HASH[P].RH+1]-
STRSTART[HASH[P].RH])=L THEN IF STREQBUF(HASH[P].RH,J)THEN GOTO 40;
IF HASH[P].LH=0 THEN{201:}
BEGIN IF HASH[P].RH>0 THEN BEGIN REPEAT IF(HASHUSED=1)THEN OVERFLOW(321,
2100);HASHUSED:=HASHUSED-1;UNTIL HASH[HASHUSED].RH=0;
HASH[P].LH:=HASHUSED;P:=HASHUSED;END;
IF L=1 THEN HASH[P].RH:=BUFFER[J]ELSE BEGIN BEGIN IF POOLPTR+L>POOLSIZE
THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
FOR K:=J TO J+L-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;HASH[P].RH:=MAKESTRING;STRREF[HASH[P].RH]:=127;
END;STCOUNT:=STCOUNT+1;GOTO 40;END{:201};P:=HASH[P].LH;END;
40:IDLOOKUP:=P;END;{:199}{204:}PROCEDURE PRIMITIVE(S:STRNUMBER;
C:HALFWORD;O:HALFWORD);VAR K:POOLPOINTER;J:SMALLNUMBER;L:SMALLNUMBER;
BEGIN K:=STRSTART[S];L:=STRSTART[S+1]-K;
FOR J:=0 TO L-1 DO BUFFER[J]:=STRPOOL[K+J];CURSYM:=IDLOOKUP(0,L);
IF S>=128 THEN BEGIN FLUSHSTRING(STRPTR-1);HASH[CURSYM].RH:=S;END;
EQTB[CURSYM].LH:=C;EQTB[CURSYM].RH:=O;END;{:204}{209:}
FUNCTION NEWNUMTOK(V:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P+1].INT:=V;MEM[P].HH.LH:=41;NEWNUMTOK:=P;END;
{:209}{210:}PROCEDURE FLUSHTOKENLI(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q>=26004 THEN BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;
END ELSE BEGIN IF MEM[Q].HH.LH=40 THEN BEGIN IF STRREF[MEM[Q+1].INT]<127
THEN IF STRREF[MEM[Q+1].INT]>1 THEN STRREF[MEM[Q+1].INT]:=STRREF[MEM[Q+1
].INT]-1 ELSE FLUSHSTRING(MEM[Q+1].INT);END;FREENODE(Q,2);END;END;END;
{:210}{218:}PROCEDURE DELETEMACREF(P:HALFWORD);
BEGIN IF MEM[P].HH.LH=0 THEN FLUSHTOKENLI(P)ELSE MEM[P].HH.LH:=MEM[P].HH
.LH-1;END;{:218}{219:}{574:}PROCEDURE PRINTCMDMOD(C,M:INTEGER);
BEGIN CASE C OF{206:}17:PRINT(324);76:PRINT(323);70:PRINT(325);
31:PRINT(316);72:PRINT(326);77:PRINT(58);78:PRINT(44);58:PRINT(327);
18:PRINT(328);60:PRINT(329);26:PRINT(330);9:PRINT(331);80:PRINT(317);
25:PRINT(332);6:PRINT(333);68:PRINT(334);11:PRINT(335);45:PRINT(123);
52:PRINT(91);12:PRINT(336);13:PRINT(337);67:PRINT(338);71:PRINT(339);
27:PRINT(340);47:PRINT(279);23:PRINT(341);15:PRINT(342);7:PRINTCHAR(92);
64:PRINT(125);63:PRINT(93);10:PRINT(343);79:PRINT(59);16:PRINT(344);
73:PRINT(345);34:PRINT(346);69:PRINT(347);74:PRINT(348);{:206}{631:}
14:IF M<=2 THEN IF M=1 THEN PRINT(496)ELSE IF M<1 THEN PRINT(318)ELSE
PRINT(497)ELSE IF M=53 THEN PRINT(498)ELSE IF M=43 THEN PRINT(499)ELSE
PRINT(500);
4:IF M<=1 THEN IF M=1 THEN PRINT(503)ELSE PRINT(319)ELSE IF M=2394 THEN
PRINT(501)ELSE PRINT(502);{:631}{638:}61:CASE M OF 1:PRINT(509);
2:PRINTCHAR(64);3:PRINT(510);OTHERS:PRINT(508)END;{:638}{645:}
57:IF M>=2394 THEN IF M=2394 THEN PRINT(520)ELSE IF M=2544 THEN PRINT(
521)ELSE PRINT(522)ELSE IF M<2 THEN PRINT(523)ELSE IF M=2 THEN PRINT(524
)ELSE PRINT(525);{:645}{660:}3:IF M=0 THEN PRINT(536)ELSE PRINT(461);
{:660}{687:}1:PRINT(565);2:CASE M OF 2:PRINT(315);4:PRINT(567);
OTHERS:PRINT(566)END;{:687}{822:}
59:IF M=0 THEN PRINT(673)ELSE PRINT(672);{:822}{834:}
32,33,36,55,44,49,35,42,54,46,50,51:PRINTOP(M);{:834}{947:}
29:PRINTTYPE(M);{:947}{952:}81:IF M=0 THEN PRINT(758)ELSE PRINT(759);
{:952}{957:}22:CASE M OF 0:PRINT(145);1:PRINT(146);2:PRINT(147);
OTHERS:PRINT(764)END;{:957}{960:}
20:IF M=0 THEN PRINT(765)ELSE PRINT(766);{:960}{970:}
21:CASE M OF 0:PRINT(779);1:PRINT(780);2:PRINT(781);3:PRINT(782);
4:PRINT(783);5:PRINT(784);OTHERS:PRINT(785)END;{:970}{975:}
30,62:BEGIN IF C=30 THEN PRINT(791)ELSE PRINT(792);PRINT(793);
PRINT(HASH[M].RH);END;39:IF M=0 THEN PRINT(794)ELSE PRINT(795);
8:PRINT(796);53,43,48:BEGIN PRINTCMDMOD(14,C);PRINT(797);PRINTLN;
SHOWTOKENLIS(MEM[MEM[M].HH.RH].HH.RH,0,1000);END;5:PRINT(798);
37:PRINT(INTNAME[M]);{:975}{984:}
66:IF M=0 THEN PRINT(805)ELSE IF M=1 THEN PRINT(806)ELSE PRINT(807);
65:IF M=6 THEN PRINT(808)ELSE PRINT(809);{:984}{1007:}
24:IF M<1 THEN PRINT(838)ELSE IF M=1 THEN PRINT(839)ELSE PRINT(840);
{:1007}{1029:}19:CASE M OF 0:PRINT(851);1:PRINT(852);2:PRINT(853);
3:PRINT(854);OTHERS:PRINT(855)END;{:1029}{1037:}
75:IF M=0 THEN PRINT(875)ELSE PRINT(876);{:1037}{1102:}
28:IF M=16 THEN PRINT(896)ELSE PRINT(895);{:1102}OTHERS:PRINT(447)END;
END;{:574}PROCEDURE SHOWMACRO(P:HALFWORD;Q,L:INTEGER);VAR R:HALFWORD;
BEGIN P:=MEM[P].HH.RH;WHILE MEM[P].HH.LH>5 DO BEGIN R:=MEM[P].HH.RH;
MEM[P].HH.RH:=0;SHOWTOKENLIS(P,0,1);MEM[P].HH.RH:=R;P:=R;END;
CASE MEM[P].HH.LH OF 0:PRINT(358);1,2,3:BEGIN PRINTCHAR(60);
PRINTCMDMOD(57,MEM[P].HH.LH);PRINT(359);END;4:PRINT(360);5:PRINT(361);
END;SHOWTOKENLIS(MEM[P].HH.RH,Q,L);END;{:219}{224:}
PROCEDURE INITBIGNODE(P:HALFWORD);VAR Q:HALFWORD;S:SMALLNUMBER;
BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];Q:=GETNODE(S);REPEAT S:=S-2;
MEM[Q+S].HH.B0:=20;MEM[Q+S+1].INT:=0;MEM[Q+S].HH.B1:=(S)DIV 2+5;
MEM[Q+S].HH.RH:=0;UNTIL S=0;MEM[Q].HH.RH:=P;MEM[P+1].INT:=Q;END;{:224}
{225:}FUNCTION IDTRANSFORM:HALFWORD;VAR P,Q,R:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P].HH.B0:=14;MEM[P].HH.B1:=11;MEM[P+1].INT:=0;
INITBIGNODE(P);Q:=MEM[P+1].INT;R:=Q+12;REPEAT R:=R-2;MEM[R].HH.B0:=16;
MEM[R+1].INT:=0;UNTIL R=Q;MEM[Q+5].INT:=65536;MEM[Q+11].INT:=65536;
IDTRANSFORM:=P;END;{:225}{226:}PROCEDURE NEWROOT(X:HALFWORD);
VAR P:HALFWORD;BEGIN P:=GETNODE(2);MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;
MEM[P].HH.RH:=X;EQTB[X].RH:=P;END;{:226}{227:}
PROCEDURE PRINTVARIABL(P:HALFWORD);LABEL 40,10;VAR Q:HALFWORD;
R:HALFWORD;BEGIN WHILE MEM[P].HH.B1>=5 DO{229:}
BEGIN CASE MEM[P].HH.B1 OF 5:PRINTCHAR(120);6:PRINTCHAR(121);
7:PRINT(364);8:PRINT(365);9:PRINT(366);10:PRINT(367);
11:BEGIN PRINT(368);PRINTINT(P-0);GOTO 10;END;END;PRINT(369);
P:=MEM[P-2*(MEM[P].HH.B1-5)].HH.RH;END{:229};Q:=0;
WHILE MEM[P].HH.B1>1 DO{228:}
BEGIN IF MEM[P].HH.B1=3 THEN BEGIN R:=NEWNUMTOK(MEM[P+2].INT);
REPEAT P:=MEM[P].HH.RH;UNTIL MEM[P].HH.B1=4;
END ELSE IF MEM[P].HH.B1=2 THEN BEGIN P:=MEM[P].HH.RH;GOTO 40;
END ELSE BEGIN IF MEM[P].HH.B1<>4 THEN CONFUSION(363);R:=GETAVAIL;
MEM[R].HH.LH:=MEM[P+2].HH.LH;END;MEM[R].HH.RH:=Q;Q:=R;
40:P:=MEM[P+2].HH.RH;END{:228};R:=GETAVAIL;MEM[R].HH.LH:=MEM[P].HH.RH;
MEM[R].HH.RH:=Q;IF MEM[P].HH.B1=1 THEN PRINT(362);
SHOWTOKENLIS(R,0,1000);FLUSHTOKENLI(R);10:END;{:227}{230:}
FUNCTION NEWSTRUCTURE(P:HALFWORD):HALFWORD;VAR Q,R:HALFWORD;
BEGIN CASE MEM[P].HH.B1 OF 0:BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(2);
EQTB[Q].RH:=R;END;3:{231:}BEGIN Q:=P;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.B1=4;Q:=MEM[Q+2].HH.RH;R:=Q+1;REPEAT Q:=R;
R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);MEM[Q].HH.RH:=R;
MEM[R+2].INT:=MEM[P+2].INT;END{:231};4:{232:}BEGIN Q:=MEM[P+2].HH.RH;
R:=MEM[Q+1].HH.LH;REPEAT Q:=R;R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);
MEM[Q].HH.RH:=R;MEM[R+2]:=MEM[P+2];
IF MEM[P+2].HH.LH=0 THEN BEGIN Q:=MEM[P+2].HH.RH+1;
WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;END;END{:232};
OTHERS:CONFUSION(370)END;MEM[R].HH.RH:=MEM[P].HH.RH;MEM[R].HH.B0:=22;
MEM[R].HH.B1:=MEM[P].HH.B1;MEM[R+1].HH.LH:=P;MEM[P].HH.B1:=2;
Q:=GETNODE(3);MEM[P].HH.RH:=Q;MEM[R+1].HH.RH:=Q;MEM[Q+2].HH.RH:=R;
MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=4;MEM[Q].HH.RH:=17;MEM[Q+2].HH.LH:=0;
NEWSTRUCTURE:=R;END;{:230}{233:}
FUNCTION FINDVARIABLE(T:HALFWORD):HALFWORD;LABEL 10;
VAR P,Q,R,S:HALFWORD;PP,QQ,RR,SS:HALFWORD;N:INTEGER;SAVEWORD:MEMORYWORD;
BEGIN P:=MEM[T].HH.LH;T:=MEM[T].HH.RH;
IF EQTB[P].LH MOD 82<>39 THEN BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF EQTB[P].RH=0 THEN NEWROOT(P);P:=EQTB[P].RH;PP:=P;
WHILE T<>0 DO BEGIN{234:}
IF MEM[PP].HH.B0<>22 THEN BEGIN IF MEM[PP].HH.B0>22 THEN BEGIN
FINDVARIABLE:=0;GOTO 10;END;SS:=NEWSTRUCTURE(PP);IF P=PP THEN P:=SS;
PP:=SS;END;IF MEM[P].HH.B0<>22 THEN P:=NEWSTRUCTURE(P){:234};
IF T<26000 THEN{235:}BEGIN N:=MEM[T+1].INT;
PP:=MEM[MEM[PP+1].HH.LH].HH.RH;Q:=MEM[MEM[P+1].HH.LH].HH.RH;
SAVEWORD:=MEM[Q+2];MEM[Q+2].INT:=2147483647;S:=P+1;REPEAT R:=S;
S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].INT;
IF N=MEM[S+2].INT THEN P:=S ELSE BEGIN P:=GETNODE(3);MEM[R].HH.RH:=P;
MEM[P].HH.RH:=S;MEM[P+2].INT:=N;MEM[P].HH.B1:=3;MEM[P].HH.B0:=0;END;
MEM[Q+2]:=SAVEWORD;END{:235}ELSE{236:}BEGIN N:=MEM[T].HH.LH;
SS:=MEM[PP+1].HH.LH;REPEAT RR:=SS;SS:=MEM[SS].HH.RH;
UNTIL N<=MEM[SS+2].HH.LH;IF N<MEM[SS+2].HH.LH THEN BEGIN QQ:=GETNODE(3);
MEM[RR].HH.RH:=QQ;MEM[QQ].HH.RH:=SS;MEM[QQ+2].HH.LH:=N;MEM[QQ].HH.B1:=4;
MEM[QQ].HH.B0:=0;MEM[QQ+2].HH.RH:=PP;SS:=QQ;END;
IF P=PP THEN BEGIN P:=SS;PP:=SS;END ELSE BEGIN PP:=SS;S:=MEM[P+1].HH.LH;
REPEAT R:=S;S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].HH.LH;
IF N=MEM[S+2].HH.LH THEN P:=S ELSE BEGIN Q:=GETNODE(3);MEM[R].HH.RH:=Q;
MEM[Q].HH.RH:=S;MEM[Q+2].HH.LH:=N;MEM[Q].HH.B1:=4;MEM[Q].HH.B0:=0;
MEM[Q+2].HH.RH:=P;P:=Q;END;END;END{:236};T:=MEM[T].HH.RH;END;
IF MEM[PP].HH.B0>=22 THEN IF MEM[PP].HH.B0=22 THEN PP:=MEM[PP+1].HH.LH
ELSE BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF MEM[P].HH.B0=22 THEN P:=MEM[P+1].HH.LH;
IF MEM[P].HH.B0=0 THEN BEGIN IF MEM[PP].HH.B0=0 THEN BEGIN MEM[PP].HH.B0
:=19;MEM[PP+1].INT:=0;END;MEM[P].HH.B0:=MEM[PP].HH.B0;MEM[P+1].INT:=0;
END;FINDVARIABLE:=P;10:END;{:233}{237:}{261:}
PROCEDURE TOSSKNOTLIST(P:HALFWORD);VAR Q:HALFWORD;R:HALFWORD;BEGIN Q:=P;
REPEAT R:=MEM[Q].HH.RH;FREENODE(Q,7);Q:=R;UNTIL Q=P;END;{:261}{370:}
PROCEDURE TOSSEDGES(H:HALFWORD);VAR P,Q:HALFWORD;BEGIN Q:=MEM[H].HH.RH;
WHILE Q<>H DO BEGIN FLUSHLIST(MEM[Q+1].HH.RH);
IF MEM[Q+1].HH.LH>1 THEN FLUSHLIST(MEM[Q+1].HH.LH);P:=Q;Q:=MEM[Q].HH.RH;
FREENODE(P,2);END;FREENODE(H,6);END;{:370}{444:}
PROCEDURE TOSSPEN(P:HALFWORD);VAR K:1..8;W,WW:HALFWORD;
BEGIN IF P<>3 THEN BEGIN FOR K:=1 TO 8 DO BEGIN W:=MEM[P+K].HH.RH;
REPEAT WW:=MEM[W].HH.RH;FREENODE(W,3);W:=WW;UNTIL W=MEM[P+K].HH.RH;END;
FREENODE(P,10);END;END;{:444}{567:}{262:}FUNCTION NULLPATH:HALFWORD;
VAR P:HALFWORD;BEGIN P:=GETNODE(7);MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;
MEM[P].HH.RH:=P;MEM[P+1].INT:=0;MEM[P+2].INT:=0;MEM[P+3].INT:=0;
MEM[P+5].INT:=0;MEM[P+4].INT:=0;MEM[P+6].INT:=0;NULLPATH:=P;END;{:262}
{320:}PROCEDURE INITEDGES(H:HALFWORD);BEGIN MEM[H].HH.LH:=H;
MEM[H].HH.RH:=H;MEM[H+1].HH.LH:=8191;MEM[H+1].HH.RH:=1;
MEM[H+2].HH.LH:=8191;MEM[H+2].HH.RH:=1;MEM[H+3].HH.LH:=4096;
MEM[H+3].HH.RH:=0;MEM[H+4].INT:=0;MEM[H+5].HH.RH:=H;MEM[H+5].HH.LH:=0;
END;FUNCTION NEWEDGES:HALFWORD;VAR H:HALFWORD;BEGIN H:=GETNODE(6);
INITEDGES(H);NEWEDGES:=H;END;{:320}PROCEDURE RINGDELETE(P:HALFWORD);
LABEL 10;VAR Q,R:HALFWORD;BEGIN Q:=MEM[P+1].INT;
IF Q<>0 THEN IF Q<>P THEN BEGIN WHILE MEM[Q].HH.B1=11 DO Q:=MEM[Q+1].INT
;IF Q=P THEN BEGIN{572:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(441);END;PRINTVARIABL(P);PRINT(442);BEGIN HELPPTR:=4;
HELPLINE[3]:=443;HELPLINE[2]:=444;HELPLINE[1]:=445;HELPLINE[0]:=446;END;
ERROR;END{:572};{568:}R:=MEM[Q+1].INT;WHILE TRUE DO BEGIN Q:=R;
R:=MEM[Q+1].INT;IF Q=P THEN GOTO 10;MEM[Q].HH.B0:=MEM[Q].HH.B0-1;
CASE MEM[Q].HH.B0 OF 2:MEM[Q+1].INT:=31;4:MEM[Q+1].INT:=312;
6:MEM[Q+1].INT:=3;11:MEM[Q+1].INT:=NULLPATH;9:MEM[Q+1].INT:=NEWEDGES;
END;Q:=R;END{:568};END;WHILE MEM[Q+1].INT<>P DO Q:=MEM[Q+1].INT;
MEM[Q+1].INT:=MEM[P+1].INT;END;10:END;{:567}{753:}
PROCEDURE RECYCLEVALUE(P:HALFWORD);LABEL 30;VAR T:SMALLNUMBER;V:INTEGER;
Q,R,S:HALFWORD;NOTSCOLDEDYE:BOOLEAN;BEGIN T:=MEM[P].HH.B0;
IF T<17 THEN V:=MEM[P+1].INT;CASE T OF 0,1,2,16,19:;
3,5,7,10,12:RINGDELETE(P);
4:BEGIN IF STRREF[V]<127 THEN IF STRREF[V]>1 THEN STRREF[V]:=STRREF[V]-1
ELSE FLUSHSTRING(V);END;
6:IF MEM[V].HH.LH=0 THEN TOSSPEN(V)ELSE MEM[V].HH.LH:=MEM[V].HH.LH-1;
11,13,8:TOSSKNOTLIST(V);9:TOSSEDGES(V);15,14:{754:}
IF V<>0 THEN BEGIN Q:=V+BIGNODESIZE[T];REPEAT Q:=Q-2;RECYCLEVALUE(Q);
UNTIL Q=V;FREENODE(V,BIGNODESIZE[T]);END{:754};17,18:{755:}
BEGIN Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.LH<>0 DO Q:=MEM[Q].HH.RH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;MEM[Q].HH.RH:=0;
FLUSHNODELIS(MEM[P+1].HH.RH);END{:755};20:{756:}
BEGIN NOTSCOLDEDYE:=TRUE;Q:=MEM[13].HH.RH;WHILE Q<>13 DO BEGIN S:=Q+1;
WHILE TRUE DO BEGIN R:=MEM[S].HH.RH;IF MEM[R].HH.LH=0 THEN GOTO 30;
IF MEM[R].HH.LH=P THEN{757:}BEGIN IF NOTSCOLDEDYE THEN BEGIN{572:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(441);
END;PRINTVARIABL(P);PRINT(442);BEGIN HELPPTR:=4;HELPLINE[3]:=443;
HELPLINE[2]:=444;HELPLINE[1]:=445;HELPLINE[0]:=446;END;ERROR;END{:572};
NOTSCOLDEDYE:=FALSE;END;MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END{:757}ELSE S:=R;END;30:IF MEM[Q+1].HH.RH=R THEN{758:}
BEGIN S:=MEM[R].HH.RH;MEM[S+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH].HH.RH:=S;MEM[Q].HH.B0:=16;
MEM[Q+1].INT:=MEM[R+1].INT;FREENODE(R,2);
IF INTERNAL[2]>0 THEN IF MEM[Q].HH.B1<>11 THEN BEGIN PRINTNL(437);
PRINTVARIABL(Q);PRINTCHAR(61);PRINTSCALED(MEM[Q+1].INT);END;Q:=S;
END{:758}ELSE Q:=MEM[R].HH.RH;END;END{:756};21,22:CONFUSION(616);
23,24:DELETEMACREF(MEM[P+1].INT);END;MEM[P].HH.B0:=0;END;{:753}{752:}
PROCEDURE FLUSHCUREXP(V:SCALED);
BEGIN CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:BEGIN RECYCLEVALUE(CUREXP)
;FREENODE(CUREXP,2);END;
6:IF MEM[CUREXP].HH.LH=0 THEN TOSSPEN(CUREXP)ELSE MEM[CUREXP].HH.LH:=MEM
[CUREXP].HH.LH-1;
4:BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[CUREXP]>1 THEN STRREF[
CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP);END;
8,11,13:TOSSKNOTLIST(CUREXP);9:TOSSEDGES(CUREXP);OTHERS:END;CURTYPE:=16;
CUREXP:=V;END;PROCEDURE FLUSHERROR(V:SCALED);BEGIN ERROR;FLUSHCUREXP(V);
END;{:752}{238:}PROCEDURE FLUSHBELOWVA(P:HALFWORD);VAR Q,R:HALFWORD;
BEGIN IF MEM[P].HH.B0<>22 THEN RECYCLEVALUE(P)ELSE BEGIN Q:=MEM[P+1].HH.
RH;WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;
FREENODE(R,3);END;R:=MEM[P+1].HH.LH;Q:=MEM[R].HH.RH;RECYCLEVALUE(R);
FREENODE(R,2);REPEAT FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;FREENODE(R,3);
UNTIL Q=17;MEM[P].HH.B0:=0;END;END;{:238}{249:}
PROCEDURE PRINTPATH(H:HALFWORD;S:STRNUMBER);LABEL 30,31;
VAR P,Q,R:HALFWORD;BEGIN PRINTDIAGNOS(371,S);PRINTLN;
IF MEM[H].HH.B0=5 THEN{250:}BEGIN PRINTTWO(MEM[H+1].INT,MEM[H+2].INT);
IF MEM[H].HH.B1=3 THEN BEGIN PRINT(374);PRINTSCALED(MEM[H+5].INT);
END ELSE BEGIN PRINTCHAR(123);PRINTSCALED(MEM[H+5].INT);PRINTCHAR(44);
PRINTSCALED(MEM[H+6].INT);END;PRINTCHAR(125);GOTO 30;END{:250};P:=H;
REPEAT Q:=MEM[P].HH.RH;IF(P=0)OR(Q=0)THEN BEGIN PRINTNL(131);GOTO 30;
END;{251:}PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);
IF MEM[P].HH.B1<=1 THEN{252:}
IF MEM[P].HH.B0=2 THEN BEGIN R:=MEM[P+3].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(374);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END{:252};
CASE MEM[P].HH.B1 OF 0:BEGIN IF MEM[P].HH.B0=4 THEN PRINT(375);
IF(MEM[Q].HH.B0<>0)OR(Q<>H)THEN Q:=0;GOTO 31;END;1:{254:}
BEGIN PRINT(380);PRINTTWO(MEM[P+5].INT,MEM[P+6].INT);PRINT(378);
IF MEM[Q].HH.B0<>1 THEN PRINT(381)ELSE PRINTTWO(MEM[Q+3].INT,MEM[Q+4].
INT);GOTO 31;END{:254};4:{255:}
IF(MEM[P].HH.B0<>1)AND(MEM[P].HH.B0<>4)THEN PRINT(375){:255};3,2:{256:}
BEGIN IF MEM[P].HH.B0>=2 THEN IF MEM[P].HH.B0=4 THEN PRINT(381)ELSE IF(
MEM[P].HH.B0<>MEM[P].HH.B1)OR(MEM[P+3].INT<>MEM[P+5].INT)THEN BEGIN{252:
}IF MEM[P].HH.B0=2 THEN BEGIN R:=MEM[P+3].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(374);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END{:252};PRINTCHAR(38);
PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);END;
IF MEM[P].HH.B1=3 THEN BEGIN PRINT(374);PRINTSCALED(MEM[P+5].INT);
PRINTCHAR(125);END ELSE BEGIN R:=MEM[P+5].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END;END{:256};OTHERS:PRINT(131)END;
IF MEM[Q].HH.B0<=1 THEN PRINT(376)ELSE IF(MEM[P+6].INT<>65536)OR(MEM[Q+4
].INT<>65536)THEN{253:}IF MEM[P+6].INT<>0 THEN BEGIN PRINT(377);
PRINTSCALED(MEM[P+6].INT);
IF MEM[P+6].INT<>MEM[Q+4].INT THEN BEGIN PRINT(378);
PRINTSCALED(MEM[Q+4].INT);END;END ELSE BEGIN PRINT(379);
IF MEM[Q+4].INT<>0 THEN PRINTCHAR(63);END{:253};31:{:251};P:=Q;
IF P<>H THEN PRINTNL(372);UNTIL P=H;
IF MEM[H].HH.B0<>0 THEN PRINTNL(373);30:ENDDIAGNOSTI(TRUE);END;{:249}
{326:}{327:}PROCEDURE PRINTWEIGHT(Q:HALFWORD);VAR W,M:INTEGER;D:INTEGER;
BEGIN D:=MEM[Q].HH.LH;W:=D MOD 8;M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;
IF FILEOFFSET>MAXPRINTLINE-9 THEN PRINTNL(32)ELSE PRINTCHAR(32);
PRINTINT(M);WHILE W>4 DO BEGIN PRINTCHAR(43);W:=W-1;END;
WHILE W<4 DO BEGIN PRINTCHAR(45);W:=W+1;END;END;{:327}
PROCEDURE PRINTEDGES(H:HALFWORD;S:STRNUMBER);VAR P,Q:HALFWORD;N:INTEGER;
BEGIN PRINTDIAGNOS(388,S);P:=MEM[H].HH.LH;N:=MEM[H+1].HH.RH-4096;
WHILE P<>H DO BEGIN PRINTNL(389);PRINTINT(N);PRINTCHAR(58);
Q:=MEM[P+1].HH.LH;WHILE Q>1 DO BEGIN PRINTWEIGHT(Q);Q:=MEM[Q].HH.RH;END;
PRINT(390);Q:=MEM[P+1].HH.RH;WHILE Q>26000 DO BEGIN PRINTWEIGHT(Q);
Q:=MEM[Q].HH.RH;END;P:=MEM[P].HH.LH;N:=N-1;END;ENDDIAGNOSTI(TRUE);END;
{:326}{373:}PROCEDURE UNROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=-Y;CURY:=X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=Y;CURY:=-X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:373}
{432:}PROCEDURE PRINTPEN(P:HALFWORD;S:STRNUMBER);
VAR NOTHINGPRINT:BOOLEAN;K:1..8;H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;
BEGIN PRINTDIAGNOS(417,S);NOTHINGPRINT:=TRUE;PRINTLN;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=P+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{433:}
BEGIN IF NOTHINGPRINT THEN NOTHINGPRINT:=FALSE ELSE PRINTNL(419);
UNROTATE(MEM[WW+1].INT+MEM[WW+2].INT,MEM[WW+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END{:433};W:=WW;END;END;
IF NOTHINGPRINT THEN BEGIN W:=MEM[P+1].HH.RH;
PRINTTWO(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);END;PRINTNL(418);
ENDDIAGNOSTI(TRUE);END;{:432}{542:}PROCEDURE PRINTDEPENDE(P:HALFWORD;
T:SMALLNUMBER);LABEL 10;VAR V:INTEGER;PP,Q:HALFWORD;BEGIN PP:=P;
WHILE TRUE DO BEGIN V:=ABS(MEM[P+1].INT);Q:=MEM[P].HH.LH;
IF Q=0 THEN BEGIN IF(V<>0)OR(P=PP)THEN BEGIN IF MEM[P+1].INT>0 THEN IF P
<>PP THEN PRINTCHAR(43);PRINTSCALED(MEM[P+1].INT);END;GOTO 10;END;{543:}
IF MEM[P+1].INT<0 THEN PRINTCHAR(45)ELSE IF P<>PP THEN PRINTCHAR(43);
IF T=17 THEN BEGIN IF V<>268435456 THEN PRINTSCALED(ROUNDFRACTIO(V));
END ELSE IF V<>65536 THEN PRINTSCALED(V){:543};
IF MEM[Q].HH.B0<>20 THEN CONFUSION(434);PRINTVARIABL(Q);V:=MEM[Q+1].INT;
WHILE V>0 DO BEGIN PRINT(435);V:=V-2;END;P:=MEM[P].HH.RH;END;10:END;
{:542}{745:}{749:}PROCEDURE PRINTDP(T:SMALLNUMBER;P:HALFWORD;
VERBOSITY:SMALLNUMBER);VAR Q:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
IF(MEM[Q].HH.LH=0)OR(VERBOSITY>0)THEN PRINTDEPENDE(P,T)ELSE PRINT(614);
END;{:749}{743:}FUNCTION STASHCUREXP:HALFWORD;VAR P:HALFWORD;
BEGIN CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:P:=CUREXP;
OTHERS:BEGIN P:=GETNODE(2);MEM[P].HH.B1:=11;MEM[P].HH.B0:=CURTYPE;
MEM[P+1].INT:=CUREXP;END END;CURTYPE:=1;MEM[P].HH.RH:=1;STASHCUREXP:=P;
END;{:743}{744:}PROCEDURE UNSTASHCUREX(P:HALFWORD);VAR Q:HALFWORD;
BEGIN CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 3,5,7,10,12,14,15,17,18:CUREXP:=P;
OTHERS:BEGIN CUREXP:=MEM[P+1].INT;FREENODE(P,2);END END;END;{:744}
PROCEDURE PRINTEXP(P:HALFWORD;VERBOSITY:SMALLNUMBER);
VAR RESTORECUREX:BOOLEAN;T:SMALLNUMBER;V:INTEGER;Q:HALFWORD;
BEGIN IF P<>0 THEN RESTORECUREX:=FALSE ELSE BEGIN P:=STASHCUREXP;
RESTORECUREX:=TRUE;END;T:=MEM[P].HH.B0;
IF T<17 THEN V:=MEM[P+1].INT ELSE V:=MEM[P+1].HH.RH;{746:}
CASE T OF 1:PRINT(610);2:IF V=30 THEN PRINT(222)ELSE PRINT(223);
3,5,7,10,12,19:{750:}BEGIN PRINTTYPE(T);
IF V<>0 THEN BEGIN PRINTCHAR(32);
WHILE MEM[V].HH.B1=11 DO V:=MEM[V+1].INT;PRINTVARIABL(V);END;END{:750};
4:BEGIN PRINTCHAR(34);PRINT(V);PRINTCHAR(34);END;6,8,9,11,13:{748:}
BEGIN IF VERBOSITY<=1 THEN PRINTTYPE(T)ELSE CASE T OF 6:PRINTPEN(V,312);
8:PRINTPATH(V,612);11:PRINTPATH(V,312);13:PRINTPATH(V,613);
9:PRINTEDGES(V,312);END;END{:748};
14,15:IF V=0 THEN PRINTTYPE(T)ELSE{747:}BEGIN PRINTCHAR(40);
Q:=V+BIGNODESIZE[T];
REPEAT IF MEM[V].HH.B0=16 THEN PRINTSCALED(MEM[V+1].INT)ELSE PRINTDP(MEM
[V].HH.B0,MEM[V+1].HH.RH,VERBOSITY);V:=V+2;IF V<>Q THEN PRINTCHAR(44);
UNTIL V=Q;PRINTCHAR(41);END{:747};16:PRINTSCALED(V);
17,18:PRINTDP(T,V,VERBOSITY);20:PRINTVARIABL(P);
OTHERS:CONFUSION(611)END{:746};IF RESTORECUREX THEN UNSTASHCUREX(P);END;
{:745}{751:}PROCEDURE DISPERR(P:HALFWORD;S:STRNUMBER);
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(615);PRINTEXP(P,1);
IF S<>312 THEN BEGIN PRINTNL(133);PRINT(S);END;END;{:751}
PROCEDURE FLUSHVARIABL(P,T:HALFWORD;DISCARDSUFFI:BOOLEAN);LABEL 10;
VAR Q,R:HALFWORD;N:HALFWORD;
BEGIN WHILE T<>0 DO BEGIN IF MEM[P].HH.B0<>22 THEN GOTO 10;
N:=MEM[T].HH.LH;T:=MEM[T].HH.RH;IF N=0 THEN BEGIN R:=P+1;
Q:=MEM[R].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHVARIABL(Q,T,DISCARDSUFFI);
IF T=0 THEN IF MEM[Q].HH.B0=22 THEN R:=Q ELSE BEGIN MEM[R].HH.RH:=MEM[Q]
.HH.RH;FREENODE(Q,3);END ELSE R:=Q;Q:=MEM[R].HH.RH;END;END;
P:=MEM[P+1].HH.LH;REPEAT R:=P;P:=MEM[P].HH.RH;UNTIL MEM[P+2].HH.LH>=N;
IF MEM[P+2].HH.LH<>N THEN GOTO 10;END;
IF DISCARDSUFFI THEN FLUSHBELOWVA(P)ELSE BEGIN IF MEM[P].HH.B0=22 THEN P
:=MEM[P+1].HH.LH;RECYCLEVALUE(P);END;10:END;{:237}{239:}
FUNCTION UNDTYPE(P:HALFWORD):SMALLNUMBER;
BEGIN CASE MEM[P].HH.B0 OF 0,1:UNDTYPE:=0;2,3:UNDTYPE:=3;4,5:UNDTYPE:=5;
6,7,8:UNDTYPE:=7;9,10:UNDTYPE:=10;11,12,13:UNDTYPE:=12;
14,15,19:UNDTYPE:=MEM[P].HH.B0;16,17,18,20:UNDTYPE:=19;END;END;{:239}
{240:}PROCEDURE CLEARSYMBOL(P:HALFWORD;SAVING:BOOLEAN);VAR Q:HALFWORD;
BEGIN Q:=EQTB[P].RH;
CASE EQTB[P].LH MOD 82 OF 8,53,43,48:IF NOT SAVING THEN DELETEMACREF(Q);
39:IF Q<>0 THEN IF SAVING THEN MEM[Q].HH.B1:=1 ELSE BEGIN FLUSHBELOWVA(Q
);FREENODE(Q,2);END;OTHERS:END;EQTB[P]:=EQTB[2243];END;{:240}{243:}
PROCEDURE SAVEVARIABLE(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].HH:=EQTB[Q];SAVEPTR:=P;END;
CLEARSYMBOL(Q,(SAVEPTR<>0));END;{:243}{244:}
PROCEDURE SAVEINTERNAL(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=2243+Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].INT:=INTERNAL[Q];SAVEPTR:=P;END;END;
{:244}{245:}PROCEDURE UNSAVE;VAR Q:HALFWORD;P:HALFWORD;
BEGIN WHILE MEM[SAVEPTR].HH.LH<>0 DO BEGIN Q:=MEM[SAVEPTR].HH.LH;
IF Q>2243 THEN BEGIN INTERNAL[Q-(2243)]:=MEM[SAVEPTR+1].INT;
END ELSE BEGIN CLEARSYMBOL(Q,FALSE);EQTB[Q]:=MEM[SAVEPTR+1].HH;
IF EQTB[Q].LH MOD 82=39 THEN BEGIN P:=EQTB[Q].RH;
IF P<>0 THEN MEM[P].HH.B1:=0;END;END;P:=MEM[SAVEPTR].HH.RH;
FREENODE(SAVEPTR,2);SAVEPTR:=P;END;P:=MEM[SAVEPTR].HH.RH;
BEGIN MEM[SAVEPTR].HH.RH:=AVAIL;AVAIL:=SAVEPTR;DYNUSED:=DYNUSED-1;END;
SAVEPTR:=P;END;{:245}{257:}FUNCTION COPYKNOT(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;K:0..6;BEGIN Q:=GETNODE(7);
FOR K:=0 TO 6 DO MEM[Q+K]:=MEM[P+K];COPYKNOT:=Q;END;{:257}{258:}
FUNCTION COPYPATH(P:HALFWORD):HALFWORD;LABEL 10;VAR Q,PP,QQ:HALFWORD;
BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B0:=MEM[PP].HH.B0;
MEM[QQ].HH.B1:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+3].INT:=MEM[PP+3].INT;
MEM[QQ+4].INT:=MEM[PP+4].INT;MEM[QQ+5].INT:=MEM[PP+5].INT;
MEM[QQ+6].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[QQ].HH.RH:=Q;COPYPATH:=Q;GOTO 10;END;
MEM[QQ].HH.RH:=GETNODE(7);QQ:=MEM[QQ].HH.RH;PP:=MEM[PP].HH.RH;END;
10:END;{:258}{259:}FUNCTION HTAPYPOC(P:HALFWORD):HALFWORD;LABEL 10;
VAR Q,PP,QQ,RR:HALFWORD;BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B1:=MEM[PP].HH.B0;
MEM[QQ].HH.B0:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+5].INT:=MEM[PP+3].INT;
MEM[QQ+6].INT:=MEM[PP+4].INT;MEM[QQ+3].INT:=MEM[PP+5].INT;
MEM[QQ+4].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[Q].HH.RH:=QQ;PATHTAIL:=PP;HTAPYPOC:=Q;
GOTO 10;END;RR:=GETNODE(7);MEM[RR].HH.RH:=QQ;QQ:=RR;PP:=MEM[PP].HH.RH;
END;10:END;{:259}{263:}{290:}
FUNCTION CURLRATIO(GAMMA,ATENSION,BTENSION:SCALED):FRACTION;
VAR ALPHA,BETA,NUM,DENOM,FF:FRACTION;
BEGIN ALPHA:=MAKEFRACTION(65536,ATENSION);
BETA:=MAKEFRACTION(65536,BTENSION);
IF ALPHA<=BETA THEN BEGIN FF:=MAKEFRACTION(ALPHA,BETA);
FF:=TAKEFRACTION(FF,FF);GAMMA:=TAKEFRACTION(GAMMA,FF);
BETA:=BETA DIV 4096;DENOM:=TAKEFRACTION(GAMMA,ALPHA)+196608-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;
END ELSE BEGIN FF:=MAKEFRACTION(BETA,ALPHA);FF:=TAKEFRACTION(FF,FF);
BETA:=TAKEFRACTION(BETA,FF)DIV 4096;
DENOM:=TAKEFRACTION(GAMMA,ALPHA)+(FF DIV 1365)-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;END;
IF NUM>=DENOM+DENOM+DENOM+DENOM THEN CURLRATIO:=1073741824 ELSE
CURLRATIO:=MAKEFRACTION(NUM,DENOM);END;{:290}{293:}
PROCEDURE SETCONTROLS(P,Q:HALFWORD;K:INTEGER);VAR RR,SS:FRACTION;
LT,RT:SCALED;SINE:FRACTION;V:FRACTION;BEGIN LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
RR:=VELOCITY(ST,CT,SF,CF,RT);SS:=VELOCITY(SF,CF,ST,CT,LT);
IF MEM[Q+4].INT=0 THEN{294:}
IF((ST>=0)AND(SF>=0))OR((ST<=0)AND(SF<=0))THEN BEGIN SINE:=TAKEFRACTION(
ABS(ST),CF)+TAKEFRACTION(ABS(SF),CT);
IF SINE>0 THEN BEGIN IF ABVSCD(ABS(SF),268435456,RR,SINE)<0 THEN RR:=
MAKEFRACTION(ABS(SF),SINE);
IF ABVSCD(ABS(ST),268435456,SS,SINE)<0 THEN SS:=MAKEFRACTION(ABS(ST),
SINE);END;END{:294};
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(TAKEFRACTION(DELTAX[K],CT)-
TAKEFRACTION(DELTAY[K],ST),RR);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(TAKEFRACTION(DELTAY[K],CT)+
TAKEFRACTION(DELTAX[K],ST),RR);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(TAKEFRACTION(DELTAX[K],CF)+
TAKEFRACTION(DELTAY[K],SF),SS);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(TAKEFRACTION(DELTAY[K],CF)-
TAKEFRACTION(DELTAX[K],SF),SS);MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;END;
{:293}PROCEDURE MAKECHOICES(KNOTS,COORDS:HALFWORD);LABEL 30,31,40;
VAR H:HALFWORD;P,Q:HALFWORD;{274:}K,N:0..PATHSIZE;R,S,T:HALFWORD;
SINE,COSINE:FRACTION;{:274}{280:}AA,BB,CC,FF,ACC:FRACTION;DD,EE:SCALED;
LT,RT:SCALED;{:280}BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,382);{265:}P:=KNOTS;
REPEAT Q:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[Q+1].INT THEN IF MEM[P+2].INT=MEM[Q+2].INT THEN IF
MEM[P].HH.B1>1 THEN BEGIN MEM[P].HH.B1:=1;
IF MEM[P].HH.B0=4 THEN BEGIN MEM[P].HH.B0:=3;MEM[P+3].INT:=65536;END;
MEM[Q].HH.B0:=1;IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B1:=3;
MEM[P+5].INT:=65536;END;MEM[P+5].INT:=MEM[P+1].INT;
MEM[Q+3].INT:=MEM[P+1].INT;MEM[P+6].INT:=MEM[P+2].INT;
MEM[Q+4].INT:=MEM[P+2].INT;END;P:=Q;UNTIL P=KNOTS{:265};{266:}H:=KNOTS;
WHILE TRUE DO BEGIN IF MEM[H].HH.B0<>4 THEN GOTO 31;
IF MEM[H].HH.B1<>4 THEN GOTO 31;H:=MEM[H].HH.RH;
IF H=KNOTS THEN BEGIN MEM[H].HH.B0:=5;GOTO 31;END;END;31:{:266};P:=H;
REPEAT{267:}Q:=MEM[P].HH.RH;
IF MEM[P].HH.B1>=2 THEN BEGIN WHILE(MEM[Q].HH.B0=4)AND(MEM[Q].HH.B1=4)DO
Q:=MEM[Q].HH.RH;{272:}{275:}K:=0;S:=P;N:=PATHSIZE;
REPEAT T:=MEM[S].HH.RH;DELTAX[K]:=MEM[T+1].INT-MEM[S+1].INT;
DELTAY[K]:=MEM[T+2].INT-MEM[S+2].INT;
DELTA[K]:=PYTHADD(DELTAX[K],DELTAY[K]);
IF K>0 THEN BEGIN SINE:=MAKEFRACTION(DELTAY[K-1],DELTA[K-1]);
COSINE:=MAKEFRACTION(DELTAX[K-1],DELTA[K-1]);
PSI[K]:=NARG(TAKEFRACTION(DELTAX[K],COSINE)+TAKEFRACTION(DELTAY[K],SINE)
,TAKEFRACTION(DELTAY[K],COSINE)-TAKEFRACTION(DELTAX[K],SINE));END;
K:=K+1;S:=T;IF K=PATHSIZE THEN OVERFLOW(387,PATHSIZE);IF S=Q THEN N:=K;
UNTIL(K>=N)AND(MEM[S].HH.B0<>5);
IF K=N THEN PSI[N]:=0 ELSE PSI[K]:=PSI[1]{:275};{276:}
IF MEM[Q].HH.B0=4 THEN BEGIN MEM[17].INT:=MEM[Q+5].INT-MEM[Q+1].INT;
MEM[18].INT:=MEM[Q+6].INT-MEM[Q+2].INT;
IF(MEM[17].INT=0)AND(MEM[18].INT=0)THEN BEGIN MEM[Q].HH.B0:=3;
MEM[Q+3].INT:=65536;END ELSE BEGIN MEM[Q].HH.B0:=2;MEM[Q+3].INT:=16;END;
END;
IF(MEM[P].HH.B1=4)AND(MEM[P].HH.B0=1)THEN BEGIN MEM[15].INT:=MEM[P+1].
INT-MEM[P+3].INT;MEM[16].INT:=MEM[P+2].INT-MEM[P+4].INT;
IF(MEM[15].INT=0)AND(MEM[16].INT=0)THEN BEGIN MEM[P].HH.B1:=3;
MEM[P+5].INT:=65536;END ELSE BEGIN MEM[P].HH.B1:=2;MEM[P+5].INT:=14;
END END{:276};{278:}K:=0;S:=P;WHILE TRUE DO BEGIN T:=MEM[S].HH.RH;
IF K=0 THEN{279:}CASE MEM[S].HH.B1 OF 2:IF MEM[T].HH.B0=2 THEN{295:}
BEGIN COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);R:=MEM[P+5].INT;
CT:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
ST:=TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(ST,CT);CT:=MAKEFRACTION(CT,AA);ST:=MAKEFRACTION(ST,AA);
R:=MEM[Q+3].INT;
CF:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
SF:=-TAKEFRACTION(MEM[R+2].INT,COSINE)+TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(SF,CF);CF:=MAKEFRACTION(CF,AA);SF:=MAKEFRACTION(SF,AA);
SETCONTROLS(P,Q,0);GOTO 30;END{:295}ELSE{287:}BEGIN R:=MEM[S+5].INT;
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);
COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
VV[0]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,
SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE))
;UU[0]:=0;WW[0]:=0;END{:287};3:IF MEM[T].HH.B0=3 THEN{296:}
BEGIN MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF RT=65536 THEN BEGIN MEM[P+5].INT:=MEM[P+1].INT+((DELTAX[0]+1)DIV 3);
MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]+1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*RT);
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(DELTAX[0],FF);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(DELTAY[0],FF);END;
IF LT=65536 THEN BEGIN MEM[Q+3].INT:=MEM[Q+1].INT-((DELTAX[0]+1)DIV 3);
MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]+1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*LT);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(DELTAX[0],FF);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(DELTAY[0],FF);END;GOTO 30;
END{:296}ELSE{288:}BEGIN CC:=MEM[S+5].INT;LT:=MEM[T+4].INT;
IF LT<>0 THEN RT:=MEM[S+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN UU[0]:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE UU[0]:=CURLRATIO(CC,RT,LT);VV[0]:=-TAKEFRACTION(PSI[1],UU[0]);
WW[0]:=0;END{:288};4:BEGIN UU[0]:=0;VV[0]:=0;WW[0]:=268435456;END;
END{:279}ELSE CASE MEM[S].HH.B0 OF 5,4:{281:}BEGIN{282:}
IF(MEM[R+6].INT=65536)OR(MEM[R+6].INT=0)THEN BEGIN AA:=134217728;
DD:=2*DELTA[K];
END ELSE BEGIN AA:=MAKEFRACTION(65536,3*MEM[R+6].INT-65536);
DD:=TAKEFRACTION(DELTA[K],805306368-MAKEFRACTION(65536,MEM[R+6].INT));
END;IF(MEM[T+4].INT=65536)OR(MEM[T+4].INT=0)THEN BEGIN BB:=134217728;
EE:=2*DELTA[K-1];
END ELSE BEGIN BB:=MAKEFRACTION(65536,3*MEM[T+4].INT-65536);
EE:=TAKEFRACTION(DELTA[K-1],805306368-MAKEFRACTION(65536,MEM[T+4].INT));
END;CC:=268435456-TAKEFRACTION(UU[K-1],AA){:282};{283:}
DD:=TAKEFRACTION(DD,CC);LT:=MEM[S+4].INT;RT:=MEM[S+6].INT;
IF LT=0 THEN LT:=65536;IF RT=0 THEN RT:=65536;
IF LT<>RT THEN IF LT<RT THEN BEGIN FF:=MAKEFRACTION(LT,RT);
FF:=TAKEFRACTION(FF,FF);DD:=TAKEFRACTION(DD,FF);
END ELSE BEGIN FF:=MAKEFRACTION(RT,LT);FF:=TAKEFRACTION(FF,FF);
EE:=TAKEFRACTION(EE,FF);END;FF:=MAKEFRACTION(EE,EE+DD){:283};
UU[K]:=TAKEFRACTION(FF,BB);{284:}ACC:=-TAKEFRACTION(PSI[K+1],UU[K]);
IF MEM[R].HH.B1=3 THEN BEGIN WW[K]:=0;
VV[K]:=ACC-TAKEFRACTION(PSI[1],268435456-FF);
END ELSE BEGIN FF:=MAKEFRACTION(268435456-FF,CC);
ACC:=ACC-TAKEFRACTION(PSI[K],FF);FF:=TAKEFRACTION(FF,AA);
VV[K]:=ACC-TAKEFRACTION(VV[K-1],FF);
IF WW[K-1]=0 THEN WW[K]:=0 ELSE WW[K]:=-TAKEFRACTION(WW[K-1],FF);
END{:284};IF MEM[S].HH.B0=5 THEN{285:}BEGIN AA:=0;BB:=268435456;
REPEAT K:=K-1;IF K=0 THEN K:=N;AA:=VV[K]-TAKEFRACTION(AA,UU[K]);
BB:=WW[K]-TAKEFRACTION(BB,UU[K]);UNTIL K=N;
AA:=MAKEFRACTION(AA,268435456-BB);THETA[N]:=AA;VV[0]:=AA;
FOR K:=1 TO N-1 DO VV[K]:=VV[K]+TAKEFRACTION(AA,WW[K]);GOTO 40;END{:285}
;END{:281};3:{289:}BEGIN CC:=MEM[S+3].INT;LT:=MEM[S+4].INT;
IF LT<>0 THEN RT:=MEM[R+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN FF:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE FF:=CURLRATIO(CC,LT,RT);
THETA[N]:=-MAKEFRACTION(TAKEFRACTION(VV[N-1],FF),268435456-TAKEFRACTION(
FF,UU[N-1]));GOTO 40;END{:289};2:{286:}BEGIN R:=MEM[S+3].INT;
SINE:=MAKEFRACTION(DELTAY[N-1],DELTA[N-1]);
COSINE:=MAKEFRACTION(DELTAX[N-1],DELTA[N-1]);
THETA[N]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].
INT,SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,
SINE));GOTO 40;END{:286};END;R:=S;S:=T;K:=K+1;END;40:{291:}
FOR K:=N-1 DOWNTO 0 DO THETA[K]:=VV[K]-TAKEFRACTION(THETA[K+1],UU[K]);
S:=P;K:=0;REPEAT T:=MEM[S].HH.RH;NSINCOS(THETA[K]);ST:=NSIN;CT:=NCOS;
NSINCOS(-PSI[K+1]-THETA[K+1]);SF:=NSIN;CF:=NCOS;SETCONTROLS(S,T,K);
K:=K+1;S:=T;UNTIL K=N{:291};30:{:278}{:272};END;P:=Q{:267};UNTIL P=H;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,383);
WHILE COORDS<>0 DO BEGIN P:=COORDS;COORDS:=MEM[P].HH.RH;FREENODE(P,3);
END;IF ARITHERROR THEN{264:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(384);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=385;HELPLINE[0]:=386;END;ERROR;
ARITHERROR:=FALSE;END{:264};END;{:263}{305:}
PROCEDURE MAKEMOVES(XX0,XX1,XX2,XX3,YY0,YY1,YY2,YY3:SCALED;
XICORR,ETACORR:SMALLNUMBER);LABEL 22,30,10;
VAR X1,X2,X3,M,R,Y1,Y2,Y3,N,S,L:INTEGER;Q,T,U,X2A,X3A,Y2A,Y3A:INTEGER;
BEGIN IF(XX3<XX0)OR(YY3<YY0)THEN CONFUSION(109);L:=16;BISECTPTR:=0;
X1:=XX1-XX0;X2:=XX2-XX1;X3:=XX3-XX2;
IF XX0>=XICORR THEN R:=(XX0-XICORR)MOD 65536 ELSE R:=65535-((-XX0+XICORR
-1)MOD 65536);M:=(XX3-XX0+R)DIV 65536;Y1:=YY1-YY0;Y2:=YY2-YY1;
Y3:=YY3-YY2;
IF YY0>=ETACORR THEN S:=(YY0-ETACORR)MOD 65536 ELSE S:=65535-((-YY0+
ETACORR-1)MOD 65536);N:=(YY3-YY0+S)DIV 65536;
IF(XX3-XX0>=268435456)OR(YY3-YY0>=268435456)THEN{307:}
BEGIN X1:=(X1+XICORR)DIV 2;X2:=(X2+XICORR)DIV 2;X3:=(X3+XICORR)DIV 2;
R:=(R+XICORR)DIV 2;Y1:=(Y1+ETACORR)DIV 2;Y2:=(Y2+ETACORR)DIV 2;
Y3:=(Y3+ETACORR)DIV 2;S:=(S+ETACORR)DIV 2;L:=15;END{:307};
WHILE TRUE DO BEGIN 22:{308:}IF M=0 THEN{309:}
WHILE N>0 DO BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;N:=N-1;END{:309}
ELSE IF N=0 THEN{310:}MOVE[MOVEPTR]:=MOVE[MOVEPTR]+M{:310}
ELSE IF M+N=2 THEN{311:}BEGIN R:=TWOTOTHE[L]-R;S:=TWOTOTHE[L]-S;
WHILE L<30 DO BEGIN X3A:=X3;X2A:=(X2+X3+XICORR)DIV 2;
X2:=(X1+X2+XICORR)DIV 2;X3:=(X2+X2A+XICORR)DIV 2;T:=X1+X2+X3;
R:=R+R-XICORR;Y3A:=Y3;Y2A:=(Y2+Y3+ETACORR)DIV 2;
Y2:=(Y1+Y2+ETACORR)DIV 2;Y3:=(Y2+Y2A+ETACORR)DIV 2;U:=Y1+Y2+Y3;
S:=S+S-ETACORR;IF T<R THEN IF U<S THEN{312:}BEGIN X1:=X3;X2:=X2A;
X3:=X3A;R:=R-T;Y1:=Y3;Y2:=Y2A;Y3:=Y3A;S:=S-U;END{:312}ELSE BEGIN{314:}
BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=2;END{:314};GOTO 30;
END ELSE IF U<S THEN BEGIN{313:}BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;
MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;END{:313};GOTO 30;END;L:=L+1;END;
R:=R-XICORR;S:=S-ETACORR;
IF ABVSCD(X1+X2+X3-R,S,Y1+Y2+Y3-S,R)-XICORR>=0 THEN{313:}
BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=1;END{:313}ELSE{314:}BEGIN MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=2;END{:314};30:END{:311}ELSE BEGIN L:=L+1;
BISECTSTACK[BISECTPTR+10]:=L;BISECTSTACK[BISECTPTR+2]:=X3;
BISECTSTACK[BISECTPTR+1]:=(X2+X3+XICORR)DIV 2;X2:=(X1+X2+XICORR)DIV 2;
X3:=(X2+BISECTSTACK[BISECTPTR+1]+XICORR)DIV 2;
BISECTSTACK[BISECTPTR]:=X3;R:=R+R+XICORR;T:=X1+X2+X3+R;
Q:=T DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+3]:=T MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+4]:=M-Q;M:=Q;BISECTSTACK[BISECTPTR+7]:=Y3;
BISECTSTACK[BISECTPTR+6]:=(Y2+Y3+ETACORR)DIV 2;Y2:=(Y1+Y2+ETACORR)DIV 2;
Y3:=(Y2+BISECTSTACK[BISECTPTR+6]+ETACORR)DIV 2;
BISECTSTACK[BISECTPTR+5]:=Y3;S:=S+S+ETACORR;U:=Y1+Y2+Y3+S;
Q:=U DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+8]:=U MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+9]:=N-Q;N:=Q;BISECTPTR:=BISECTPTR+11;GOTO 22;
END{:308};IF BISECTPTR=0 THEN GOTO 10;{306:}BISECTPTR:=BISECTPTR-11;
X1:=BISECTSTACK[BISECTPTR];X2:=BISECTSTACK[BISECTPTR+1];
X3:=BISECTSTACK[BISECTPTR+2];R:=BISECTSTACK[BISECTPTR+3];
M:=BISECTSTACK[BISECTPTR+4];Y1:=BISECTSTACK[BISECTPTR+5];
Y2:=BISECTSTACK[BISECTPTR+6];Y3:=BISECTSTACK[BISECTPTR+7];
S:=BISECTSTACK[BISECTPTR+8];N:=BISECTSTACK[BISECTPTR+9];
L:=BISECTSTACK[BISECTPTR+10]{:306};END;10:END;{:305}{315:}
PROCEDURE SMOOTHMOVES(B,T:INTEGER);VAR K:1..MOVESIZE;A,AA,AAA:INTEGER;
BEGIN IF T-B>=3 THEN BEGIN K:=B+2;AA:=MOVE[K-1];AAA:=MOVE[K-2];
REPEAT A:=MOVE[K];IF ABS(A-AA)>1 THEN{316:}
IF A>AA THEN BEGIN IF AAA>=AA THEN IF A>=MOVE[K+1]THEN BEGIN MOVE[K-1]:=
MOVE[K-1]+1;MOVE[K]:=A-1;END;
END ELSE BEGIN IF AAA<=AA THEN IF A<=MOVE[K+1]THEN BEGIN MOVE[K-1]:=MOVE
[K-1]-1;MOVE[K]:=A+1;END;END{:316};K:=K+1;AAA:=AA;AA:=A;UNTIL K=T;END;
END;{:315}{322:}PROCEDURE FIXOFFSET;VAR P,Q:HALFWORD;DELTA:INTEGER;
BEGIN DELTA:=8*(MEM[CUREDGES+3].HH.LH-4096);MEM[CUREDGES+3].HH.LH:=4096;
Q:=MEM[CUREDGES].HH.RH;WHILE Q<>CUREDGES DO BEGIN P:=MEM[Q+1].HH.RH;
WHILE P>26000 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;
END;P:=MEM[Q+1].HH.LH;
WHILE P>1 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;END;
Q:=MEM[Q].HH.RH;END;END;{:322}{323:}
PROCEDURE EDGEPREP(ML,MR,NL,NR:INTEGER);VAR DELTA:HALFWORD;P,Q:HALFWORD;
BEGIN ML:=ML+4096;MR:=MR+4096;NL:=NL+4096;NR:=NR+4095;
IF ML<MEM[CUREDGES+2].HH.LH THEN MEM[CUREDGES+2].HH.LH:=ML;
IF MR>MEM[CUREDGES+2].HH.RH THEN MEM[CUREDGES+2].HH.RH:=MR;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-4096)<4096)THEN
FIXOFFSET;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN BEGIN MEM[CUREDGES+1].HH.LH:=NR+1;
MEM[CUREDGES+1].HH.RH:=NR;END;IF NL<MEM[CUREDGES+1].HH.LH THEN{324:}
BEGIN DELTA:=MEM[CUREDGES+1].HH.LH-NL;MEM[CUREDGES+1].HH.LH:=NL;
P:=MEM[CUREDGES].HH.RH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=26000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.LH:=Q;MEM[Q].HH.RH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.LH:=CUREDGES;MEM[CUREDGES].HH.RH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NL-1;
END{:324};IF NR>MEM[CUREDGES+1].HH.RH THEN{325:}
BEGIN DELTA:=NR-MEM[CUREDGES+1].HH.RH;MEM[CUREDGES+1].HH.RH:=NR;
P:=MEM[CUREDGES].HH.LH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=26000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.RH:=CUREDGES;MEM[CUREDGES].HH.LH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NR+1;
END{:325};END;{:323}{328:}FUNCTION COPYEDGES(H:HALFWORD):HALFWORD;
VAR P,R:HALFWORD;HH,PP,QQ,RR,SS:HALFWORD;BEGIN HH:=GETNODE(6);
MEM[HH+1]:=MEM[H+1];MEM[HH+2]:=MEM[H+2];MEM[HH+3]:=MEM[H+3];
MEM[HH+4]:=MEM[H+4];MEM[HH+5].HH.LH:=MEM[HH+1].HH.RH+1;
MEM[HH+5].HH.RH:=HH;P:=MEM[H].HH.RH;QQ:=HH;
WHILE P<>H DO BEGIN PP:=GETNODE(2);MEM[QQ].HH.RH:=PP;MEM[PP].HH.LH:=QQ;
{329:}R:=MEM[P+1].HH.RH;RR:=PP+1;WHILE R>26000 DO BEGIN SS:=GETAVAIL;
MEM[RR].HH.RH:=SS;RR:=SS;MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;
END;MEM[RR].HH.RH:=26000;R:=MEM[P+1].HH.LH;RR:=26001;
WHILE R>1 DO BEGIN SS:=GETAVAIL;MEM[RR].HH.RH:=SS;RR:=SS;
MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;END;MEM[RR].HH.RH:=R;
MEM[PP+1].HH.LH:=MEM[26001].HH.RH{:329};P:=MEM[P].HH.RH;QQ:=PP;END;
MEM[QQ].HH.RH:=HH;MEM[HH].HH.LH:=QQ;COPYEDGES:=HH;END;{:328}{330:}
PROCEDURE YREFLECTEDGE;VAR P,Q,R:HALFWORD;
BEGIN P:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+1].HH.LH:=8191-MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=8191-P;
MEM[CUREDGES+5].HH.LH:=8191-MEM[CUREDGES+5].HH.LH;
P:=MEM[CUREDGES].HH.RH;Q:=CUREDGES;REPEAT R:=MEM[P].HH.RH;
MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;Q:=P;P:=R;UNTIL Q=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:330}{331:}PROCEDURE XREFLECTEDGE;
VAR P,Q,R,S:HALFWORD;M:INTEGER;BEGIN P:=MEM[CUREDGES+2].HH.LH;
MEM[CUREDGES+2].HH.LH:=8192-MEM[CUREDGES+2].HH.RH;
MEM[CUREDGES+2].HH.RH:=8192-P;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-4096)<4096)THEN
FIXOFFSET;M:=(MEM[CUREDGES+3].HH.LH*8+4)*2;P:=MEM[CUREDGES].HH.RH;
REPEAT{333:}Q:=MEM[P+1].HH.RH;R:=26000;
WHILE Q<>26000 DO BEGIN S:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;R:=Q;
MEM[R].HH.LH:=M-MEM[Q].HH.LH;Q:=S;END;MEM[P+1].HH.RH:=R{:333};{332:}
Q:=MEM[P+1].HH.LH;WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=M-MEM[Q].HH.LH;
Q:=MEM[Q].HH.RH;END{:332};P:=MEM[P].HH.RH;UNTIL P=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:331}{334:}PROCEDURE SORTEDGES(H:HALFWORD);
LABEL 30;VAR K:HALFWORD;P,Q,R,S:HALFWORD;BEGIN R:=MEM[H+1].HH.LH;
MEM[H+1].HH.LH:=0;P:=MEM[R].HH.RH;MEM[R].HH.RH:=26000;
MEM[26001].HH.RH:=R;WHILE P>1 DO BEGIN K:=MEM[P].HH.LH;Q:=26001;
REPEAT R:=Q;Q:=MEM[R].HH.RH;UNTIL K<=MEM[Q].HH.LH;MEM[R].HH.RH:=P;
R:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;P:=R;END;{335:}BEGIN R:=H+1;
Q:=MEM[R].HH.RH;P:=MEM[26001].HH.RH;WHILE TRUE DO BEGIN K:=MEM[P].HH.LH;
WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;Q:=MEM[R].HH.RH;END;MEM[R].HH.RH:=P;
S:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;IF S=26000 THEN GOTO 30;R:=P;P:=S;END;
30:END{:335};END;{:334}{336:}PROCEDURE CULLEDGES(WPLUS,WMINUS:INTEGER);
LABEL 30;VAR P,Q,R,S:HALFWORD;W:INTEGER;D:INTEGER;M:INTEGER;MM:INTEGER;
WW:INTEGER;PREVW:INTEGER;N,MINN,MAXN:HALFWORD;MIND,MAXD:HALFWORD;
BEGIN MIND:=262143;MAXD:=0;MINN:=262143;MAXN:=0;P:=MEM[CUREDGES].HH.RH;
N:=MEM[CUREDGES+1].HH.LH;
WHILE P<>CUREDGES DO BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
IF MEM[P+1].HH.RH>26000 THEN{337:}BEGIN R:=26001;Q:=MEM[P+1].HH.RH;
WW:=0;M:=1000000;PREVW:=0;
WHILE TRUE DO BEGIN IF Q=26000 THEN MM:=1000000 ELSE BEGIN D:=MEM[Q].HH.
LH;MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;IF MM>M THEN BEGIN{338:}
IF W<>PREVW THEN BEGIN S:=GETAVAIL;MEM[R].HH.RH:=S;
MEM[S].HH.LH:=8*M+4+W-PREVW;R:=S;PREVW:=W;END{:338};
IF Q=26000 THEN GOTO 30;END;M:=MM;
IF(WW>=WPLUS)OR(WW<=WMINUS)THEN W:=1 ELSE W:=0;S:=MEM[Q].HH.RH;
BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;END;Q:=S;END;
30:MEM[R].HH.RH:=26000;MEM[P+1].HH.RH:=MEM[26001].HH.RH;
IF R<>26001 THEN{339:}BEGIN IF MINN=262143 THEN MINN:=N;MAXN:=N;
IF MIND>MEM[MEM[26001].HH.RH].HH.LH THEN MIND:=MEM[MEM[26001].HH.RH].HH.
LH;IF MAXD<MEM[R].HH.LH THEN MAXD:=MEM[R].HH.LH;END{:339};END{:337};
P:=MEM[P].HH.RH;N:=N+1;END;{340:}IF MINN>MAXN THEN{341:}
BEGIN P:=MEM[CUREDGES].HH.RH;WHILE P<>CUREDGES DO BEGIN Q:=MEM[P].HH.RH;
FREENODE(P,2);P:=Q;END;INITEDGES(CUREDGES);END{:341}
ELSE BEGIN N:=MEM[CUREDGES+1].HH.LH;MEM[CUREDGES+1].HH.LH:=MINN;
WHILE MINN>N DO BEGIN P:=MEM[CUREDGES].HH.RH;
MEM[CUREDGES].HH.RH:=MEM[P].HH.RH;MEM[MEM[P].HH.RH].HH.LH:=CUREDGES;
FREENODE(P,2);N:=N+1;END;N:=MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=MAXN;MEM[CUREDGES+5].HH.LH:=MAXN+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;
WHILE MAXN<N DO BEGIN P:=MEM[CUREDGES].HH.LH;
MEM[CUREDGES].HH.LH:=MEM[P].HH.LH;MEM[MEM[P].HH.LH].HH.RH:=CUREDGES;
FREENODE(P,2);N:=N-1;END;
MEM[CUREDGES+2].HH.LH:=((MIND)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
MEM[CUREDGES+2].HH.RH:=((MAXD)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
END{:340};MEM[CUREDGES+4].INT:=0;END;{:336}{342:}PROCEDURE XYSWAPEDGES;
LABEL 30;VAR MMAGIC,NMAGIC:INTEGER;P,Q,R,S:HALFWORD;{345:}
MSPREAD:INTEGER;J,JJ:0..MOVESIZE;M,MM:INTEGER;PD,RD:INTEGER;
PM,RM:INTEGER;W:INTEGER;WW:INTEGER;DW:INTEGER;{:345}{351:}
EXTRAS:INTEGER;XW:-3..3;K:INTEGER;{:351}BEGIN{344:}
MSPREAD:=MEM[CUREDGES+2].HH.RH-MEM[CUREDGES+2].HH.LH;
IF MSPREAD>MOVESIZE THEN OVERFLOW(391,MOVESIZE);
FOR J:=0 TO MSPREAD DO MOVE[J]:=26000{:344};{343:}P:=GETNODE(2);
MEM[P+1].HH.RH:=26000;MEM[P+1].HH.LH:=0;MEM[P].HH.LH:=CUREDGES;
MEM[MEM[CUREDGES].HH.RH].HH.LH:=P;P:=GETNODE(2);MEM[P+1].HH.RH:=26000;
MEM[P].HH.LH:=MEM[CUREDGES].HH.LH;{:343};{353:}
MMAGIC:=MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096;
NMAGIC:=8*MEM[CUREDGES+1].HH.RH+12{:353};REPEAT Q:=MEM[P].HH.LH;
IF MEM[Q+1].HH.LH>1 THEN SORTEDGES(Q);{346:}R:=MEM[P+1].HH.RH;
FREENODE(P,2);P:=R;PD:=MEM[P].HH.LH;PM:=PD DIV 8;R:=MEM[Q+1].HH.RH;
RD:=MEM[R].HH.LH;RM:=RD DIV 8;W:=0;
WHILE TRUE DO BEGIN IF PM<RM THEN MM:=PM ELSE MM:=RM;IF W<>0 THEN{350:}
IF M<>MM THEN BEGIN IF MM-MMAGIC>=MOVESIZE THEN CONFUSION(365);
EXTRAS:=(ABS(W)-1)DIV 3;
IF EXTRAS>0 THEN BEGIN IF W>0 THEN XW:=+3 ELSE XW:=-3;WW:=W-EXTRAS*XW;
END ELSE WW:=W;REPEAT J:=M-MMAGIC;
FOR K:=1 TO EXTRAS DO BEGIN S:=GETAVAIL;MEM[S].HH.LH:=NMAGIC+XW;
MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;END;S:=GETAVAIL;
MEM[S].HH.LH:=NMAGIC+WW;MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;M:=M+1;
UNTIL M=MM;END{:350};IF PD<RD THEN BEGIN DW:=(PD MOD 8)-4;{348:}
S:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;
END;P:=S;PD:=MEM[P].HH.LH;PM:=PD DIV 8{:348};
END ELSE BEGIN IF R=26000 THEN GOTO 30;DW:=-((RD MOD 8)-4);{347:}
R:=MEM[R].HH.RH;RD:=MEM[R].HH.LH;RM:=RD DIV 8{:347};END;M:=MM;W:=W+DW;
END;30:{:346};P:=Q;NMAGIC:=NMAGIC-8;UNTIL MEM[P].HH.LH=CUREDGES;
FREENODE(P,2);{352:}MOVE[MSPREAD]:=0;J:=0;WHILE MOVE[J]=26000 DO J:=J+1;
IF J=MSPREAD THEN INITEDGES(CUREDGES)ELSE BEGIN MM:=MEM[CUREDGES+2].HH.
LH;MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+3].HH.LH:=4096;JJ:=MSPREAD-1;
WHILE MOVE[JJ]=26000 DO JJ:=JJ-1;MEM[CUREDGES+1].HH.LH:=J+MM;
MEM[CUREDGES+1].HH.RH:=JJ+MM;Q:=CUREDGES;REPEAT P:=GETNODE(2);
MEM[Q].HH.RH:=P;MEM[P].HH.LH:=Q;MEM[P+1].HH.RH:=MOVE[J];
MEM[P+1].HH.LH:=0;J:=J+1;Q:=P;UNTIL J>JJ;MEM[Q].HH.RH:=CUREDGES;
MEM[CUREDGES].HH.LH:=Q;MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;MEM[CUREDGES+4].INT:=0;END;{:352};END;
{:342}{354:}PROCEDURE MERGEEDGES(H:HALFWORD);LABEL 30;
VAR P,Q,R,PP,QQ,RR:HALFWORD;N:INTEGER;K:HALFWORD;DELTA:INTEGER;
BEGIN IF MEM[H].HH.RH<>H THEN BEGIN IF(MEM[H+2].HH.LH<MEM[CUREDGES+2].HH
.LH)OR(MEM[H+2].HH.RH>MEM[CUREDGES+2].HH.RH)OR(MEM[H+1].HH.LH<MEM[
CUREDGES+1].HH.LH)OR(MEM[H+1].HH.RH>MEM[CUREDGES+1].HH.RH)THEN EDGEPREP(
MEM[H+2].HH.LH-4096,MEM[H+2].HH.RH-4096,MEM[H+1].HH.LH-4096,MEM[H+1].HH.
RH-4095);IF MEM[H+3].HH.LH<>MEM[CUREDGES+3].HH.LH THEN{355:}
BEGIN PP:=MEM[H].HH.RH;DELTA:=8*(MEM[CUREDGES+3].HH.LH-MEM[H+3].HH.LH);
REPEAT QQ:=MEM[PP+1].HH.RH;
WHILE QQ>26000 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;QQ:=MEM[PP+1].HH.LH;
WHILE QQ>1 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;PP:=MEM[PP].HH.RH;UNTIL PP=H;END{:355};
N:=MEM[CUREDGES+1].HH.LH;P:=MEM[CUREDGES].HH.RH;PP:=MEM[H].HH.RH;
WHILE N<MEM[H+1].HH.LH DO BEGIN N:=N+1;P:=MEM[P].HH.RH;END;REPEAT{356:}
QQ:=MEM[PP+1].HH.LH;
IF QQ>1 THEN IF MEM[P+1].HH.LH<=1 THEN MEM[P+1].HH.LH:=QQ ELSE BEGIN
WHILE MEM[QQ].HH.RH>1 DO QQ:=MEM[QQ].HH.RH;
MEM[QQ].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=MEM[PP+1].HH.LH;END;
MEM[PP+1].HH.LH:=0;QQ:=MEM[PP+1].HH.RH;
IF QQ<>26000 THEN BEGIN IF MEM[P+1].HH.LH=1 THEN MEM[P+1].HH.LH:=0;
MEM[PP+1].HH.RH:=26000;R:=P+1;Q:=MEM[R].HH.RH;
IF Q=26000 THEN MEM[P+1].HH.RH:=QQ ELSE WHILE TRUE DO BEGIN K:=MEM[QQ].
HH.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;Q:=MEM[R].HH.RH;END;
MEM[R].HH.RH:=QQ;RR:=MEM[QQ].HH.RH;MEM[QQ].HH.RH:=Q;
IF RR=26000 THEN GOTO 30;R:=QQ;QQ:=RR;END;END;30:{:356};
PP:=MEM[PP].HH.RH;P:=MEM[P].HH.RH;UNTIL PP=H;END;END;{:354}{358:}
PROCEDURE BEGINEDGETRA;BEGIN PRINTDIAGNOS(392,312);PRINT(393);
PRINTINT(CURWT);PRINTCHAR(41);TRACEX:=-4096;END;PROCEDURE TRACEACORNER;
BEGIN IF FILEOFFSET>MAXPRINTLINE-13 THEN PRINTNL(312);PRINTCHAR(40);
PRINTINT(TRACEX);PRINTCHAR(44);PRINTINT(TRACEYY);PRINTCHAR(41);
TRACEY:=TRACEYY;END;PROCEDURE ENDEDGETRACI;
BEGIN IF TRACEX=-4096 THEN PRINTNL(394)ELSE BEGIN TRACEACORNER;
PRINTCHAR(46);END;ENDDIAGNOSTI(TRUE);END;{:358}{359:}
PROCEDURE TRACENEWEDGE(R:HALFWORD;N:INTEGER);VAR D:INTEGER;W:-3..3;
M,N0,N1:INTEGER;BEGIN D:=MEM[R].HH.LH;W:=(D MOD 8)-4;
M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;IF W=CURWT THEN BEGIN N0:=N+1;N1:=N;
END ELSE BEGIN N0:=N;N1:=N+1;END;
IF M<>TRACEX THEN BEGIN IF TRACEX=-4096 THEN BEGIN PRINTNL(312);
TRACEYY:=N0;END ELSE IF TRACEYY<>N0 THEN PRINTCHAR(63)ELSE TRACEACORNER;
TRACEX:=M;TRACEACORNER;END ELSE BEGIN IF N0<>TRACEYY THEN PRINTCHAR(33);
IF((N0<N1)AND(TRACEY>TRACEYY))OR((N0>N1)AND(TRACEY<TRACEYY))THEN
TRACEACORNER;END;TRACEYY:=N1;END;{:359}{360:}
PROCEDURE LINEEDGES(X0,Y0,X1,Y1:SCALED);LABEL 30,31;
VAR M0,N0,M1,N1:INTEGER;DELX,DELY:SCALED;YT:SCALED;TX:SCALED;
P,R:HALFWORD;BASE:INTEGER;N:INTEGER;BEGIN N0:=ROUNDUNSCALE(Y0);
N1:=ROUNDUNSCALE(Y1);IF N0<>N1 THEN BEGIN M0:=ROUNDUNSCALE(X0);
M1:=ROUNDUNSCALE(X1);DELX:=X1-X0;DELY:=Y1-Y0;YT:=N0*65536-32768;
Y0:=Y0-YT;Y1:=Y1-YT;IF N0<N1 THEN{361:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4-CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N0,N1)ELSE EDGEPREP(M1,M0,N0,N1);{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
Y0:=65536-Y0;WHILE TRUE DO BEGIN R:=GETAVAIL;
MEM[R].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=R;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX-1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0+TX)+BASE;Y1:=Y1-65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1<65536 THEN GOTO 30;
P:=MEM[P].HH.RH;Y0:=Y0+65536;N:=N+1;END;30:END{:361}ELSE{362:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4+CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N1,N0)ELSE EDGEPREP(M1,M0,N1,N0);N0:=N0-1;
{363:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
WHILE TRUE DO BEGIN R:=GETAVAIL;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[P+1].HH.LH:=R;TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX+1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0-TX)+BASE;Y1:=Y1+65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1>=0 THEN GOTO 31;
P:=MEM[P].HH.LH;Y0:=Y0+65536;N:=N-1;END;31:END{:362};
MEM[CUREDGES+5].HH.RH:=P;MEM[CUREDGES+5].HH.LH:=N+4096;END;END;{:360}
{364:}PROCEDURE MOVETOEDGES(M0,N0,M1,N1:INTEGER;OCTANT:SMALLNUMBER);
LABEL 60,61,62,63,30;VAR DELTA:0..MOVESIZE;K:0..MOVESIZE;P,R:HALFWORD;
DX:INTEGER;EDGEANDWEIGH:INTEGER;J:INTEGER;N:INTEGER;SUM:INTEGER;
BEGIN DELTA:=N1-N0;SUM:=MOVE[0];
FOR K:=1 TO DELTA DO SUM:=SUM+ABS(MOVE[K]);
IF SUM<>M1-M0 THEN CONFUSION(48);{365:}CASE OCTANT OF 1:BEGIN DX:=8;
EDGEPREP(M0,M1,N0,N1);GOTO 60;END;5:BEGIN DX:=8;EDGEPREP(N0,N1,M0,M1);
GOTO 62;END;6:BEGIN DX:=-8;EDGEPREP(-N1,-N0,M0,M1);N0:=-N0;GOTO 62;END;
2:BEGIN DX:=-8;EDGEPREP(-M1,-M0,N0,N1);M0:=-M0;GOTO 60;END;
4:BEGIN DX:=-8;EDGEPREP(-M1,-M0,-N1,-N0);M0:=-M0;GOTO 61;END;
8:BEGIN DX:=-8;EDGEPREP(-N1,-N0,-M1,-M0);N0:=-N0;GOTO 63;END;
7:BEGIN DX:=8;EDGEPREP(N0,N1,-M1,-M0);GOTO 63;END;3:BEGIN DX:=8;
EDGEPREP(M0,M1,-N1,-N0);GOTO 61;END;END;{:365};60:{366:}{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4-CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;K:=K+1;N:=N+1;UNTIL K=DELTA;END;
GOTO 30{:366};61:{367:}N0:=-N0-1;{363:}N:=MEM[CUREDGES+5].HH.LH-4096;
P:=MEM[CUREDGES+5].HH.RH;IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;
P:=MEM[P].HH.RH;UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;
UNTIL N=N0{:363};IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4+CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;K:=K+1;N:=N-1;UNTIL K=DELTA;END;
GOTO 30{:367};62:{368:}
EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4-CURWT;N0:=M0;K:=0;{363:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;J:=J-1;N:=N+1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:368};
63:{369:}EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4+CURWT;N0:=-M0-1;
K:=0;{363:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:363};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;J:=J-1;N:=N-1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:369};
30:MEM[CUREDGES+5].HH.LH:=N+4096;MEM[CUREDGES+5].HH.RH:=P;END;{:364}
{372:}PROCEDURE ROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=Y;CURY:=-X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=-Y;CURY:=X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:372}
{375:}FUNCTION CROSSINGPOIN(A,B,C:INTEGER):FRACTION;LABEL 10;
VAR D:INTEGER;X,XX,X0,X1,X2:INTEGER;
BEGIN IF A<0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
IF C>=0 THEN BEGIN IF B>=0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;IF A=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
END ELSE IF A=0 THEN IF B<=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
{376:}D:=1;X0:=A;X1:=A-B;X2:=B-C;REPEAT X0:=X0+X0;X:=(X1+X2)DIV 2;
IF X1>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN XX:=X1+X;
IF XX>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN X0:=X0-XX;
IF X<=X0 THEN IF X+X2<=X0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;X1:=X;D:=D+D+1;END;END;UNTIL D>=268435456;
CROSSINGPOIN:=D-268435456{:376};10:END;{:375}{378:}
PROCEDURE PRINTSPEC(H:HALFWORD;S:STRNUMBER);LABEL 45,30;
VAR P,Q:HALFWORD;OCTANT:SMALLNUMBER;BEGIN PRINTDIAGNOS(395,S);P:=H;
OCTANT:=MEM[P+3].INT;PRINTLN;UNROTATE(MEM[H+1].INT,MEM[H+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(396);WHILE TRUE DO BEGIN{379:}
CASE OCTANT OF 1:PRINT(399);5:PRINT(400);6:PRINT(401);2:PRINT(402);
4:PRINT(403);8:PRINT(404);7:PRINT(405);3:PRINT(406);END;PRINT(407){:379}
;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;IF MEM[P].HH.B1=0 THEN GOTO 45;
{380:}BEGIN PRINTNL(408);UNROTATE(MEM[P+5].INT,MEM[P+6].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(378);
UNROTATE(MEM[Q+3].INT,MEM[Q+4].INT,OCTANT);PRINTTWO(CURX,CURY);
PRINTNL(372);UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(409);PRINTINT(MEM[Q].HH.B0-1);END{:380};P:=Q;
END;45:IF Q=H THEN GOTO 30;P:=Q;OCTANT:=MEM[P+3].INT;PRINTNL(397);END;
30:PRINTNL(398);ENDDIAGNOSTI(TRUE);END;{:378}{381:}{389:}
PROCEDURE SPLITCUBIC(P:HALFWORD;T:FRACTION);VAR V:SCALED;Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[P].HH.RH:=R;MEM[R].HH.RH:=Q;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,MEM[P].HH.B1);MEM[R].HH.B0:=MEM[Q].HH.B0;
MEM[R].HH.B1:=MEM[P].HH.B1;
V:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-MEM[Q+3].INT,T);
MEM[P+5].INT:=MEM[P+1].INT-TAKEFRACTION(MEM[P+1].INT-MEM[P+5].INT,T);
MEM[Q+3].INT:=MEM[Q+3].INT-TAKEFRACTION(MEM[Q+3].INT-CURX,T);
MEM[R+3].INT:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-V,T);
MEM[R+5].INT:=V-TAKEFRACTION(V-MEM[Q+3].INT,T);
MEM[R+1].INT:=MEM[R+3].INT-TAKEFRACTION(MEM[R+3].INT-MEM[R+5].INT,T);
V:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-MEM[Q+4].INT,T);
MEM[P+6].INT:=MEM[P+2].INT-TAKEFRACTION(MEM[P+2].INT-MEM[P+6].INT,T);
MEM[Q+4].INT:=MEM[Q+4].INT-TAKEFRACTION(MEM[Q+4].INT-CURY,T);
MEM[R+4].INT:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-V,T);
MEM[R+6].INT:=V-TAKEFRACTION(V-MEM[Q+4].INT,T);
MEM[R+2].INT:=MEM[R+4].INT-TAKEFRACTION(MEM[R+4].INT-MEM[R+6].INT,T);
END;{:389}{402:}PROCEDURE REMOVECUBIC(P:HALFWORD);VAR Q:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=MEM[Q].HH.B1;
MEM[P].HH.RH:=MEM[Q].HH.RH;MEM[P+1].INT:=MEM[Q+1].INT;
MEM[P+2].INT:=MEM[Q+2].INT;MEM[P+5].INT:=MEM[Q+5].INT;
MEM[P+6].INT:=MEM[Q+6].INT;FREENODE(Q,7);END;{:402}{406:}
PROCEDURE NEWBOUNDARY(P:HALFWORD;OCTANT:SMALLNUMBER);VAR Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;
MEM[R].HH.B0:=MEM[Q].HH.B0;MEM[R+3].INT:=MEM[Q+3].INT;
MEM[R+4].INT:=MEM[Q+4].INT;MEM[R].HH.B1:=0;MEM[Q].HH.B0:=0;
MEM[R+5].INT:=OCTANT;MEM[Q+3].INT:=MEM[Q].HH.B1;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,OCTANT);MEM[R+1].INT:=CURX;MEM[R+2].INT:=CURY;END;
{:406}FUNCTION MAKESPEC(H:HALFWORD;SAFETYMARGIN:SCALED):HALFWORD;
LABEL 22,30;VAR P,Q,R,S,PP,QQ:HALFWORD;K:INTEGER;CHOPPED:BOOLEAN;
MAXALLOWED:SCALED;XH:SCALED;{386:}DEL1,DEL2,DEL3,DEL,DMAX:SCALED;
T:FRACTION;DESTX,DESTY:SCALED;{:386}{408:}O1,O2:SMALLNUMBER;
CLOCKWISE:BOOLEAN;TURNAROUND:BOOLEAN;DX1,DY1,DX2,DY2:INTEGER;{:408}
BEGIN IF INTERNAL[4]>0 THEN PRINTPATH(H,410);
MAXALLOWED:=268402687-SAFETYMARGIN;{383:}P:=H;K:=1;CHOPPED:=FALSE;
REPEAT IF ABS(MEM[P+3].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+3].INT>0 THEN MEM[P+3].INT:=MAXALLOWED ELSE MEM[P+3].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+4].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+4].INT>0 THEN MEM[P+4].INT:=MAXALLOWED ELSE MEM[P+4].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+1].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+1].INT>0 THEN MEM[P+1].INT:=MAXALLOWED ELSE MEM[P+1].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+2].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+2].INT>0 THEN MEM[P+2].INT:=MAXALLOWED ELSE MEM[P+2].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+5].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+5].INT>0 THEN MEM[P+5].INT:=MAXALLOWED ELSE MEM[P+5].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+6].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+6].INT>0 THEN MEM[P+6].INT:=MAXALLOWED ELSE MEM[P+6].INT:=-
MAXALLOWED;END;P:=MEM[P].HH.RH;MEM[P].HH.B0:=K;K:=K+1;UNTIL P=H;
IF CHOPPED THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(412);END;BEGIN HELPPTR:=4;HELPLINE[3]:=413;
HELPLINE[2]:=414;HELPLINE[1]:=415;HELPLINE[0]:=416;END;ERROR;END{:383};
{384:}P:=H;XH:=MEM[H+1].INT;REPEAT Q:=MEM[P].HH.RH;{385:}
IF Q=H THEN DESTX:=XH ELSE DESTX:=MEM[Q+1].INT;
DEL1:=MEM[P+5].INT-MEM[P+1].INT;DEL2:=MEM[Q+3].INT-MEM[P+5].INT;
DEL3:=DESTX-MEM[Q+3].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{388:}
BEGIN MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+5].INT:=-MEM[P+5].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTX:=-DESTX;MEM[P].HH.B1:=2;END{:388};T:=CROSSINGPOIN(DEL1,DEL2,DEL3);
IF T<268435456 THEN{390:}BEGIN SPLITCUBIC(P,T);R:=MEM[P].HH.RH;
IF MEM[R].HH.B1>1 THEN MEM[R].HH.B1:=1 ELSE MEM[R].HH.B1:=2;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT;
MEM[R+3].INT:=MEM[R+1].INT;MEM[R+1].INT:=-MEM[R+1].INT;
MEM[R+5].INT:=MEM[R+1].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{391:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT<-DESTX THEN MEM[S+1].INT:=-DESTX;
IF MEM[S+1].INT<MEM[R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
MEM[S].HH.B1:=MEM[P].HH.B1;MEM[S+3].INT:=MEM[S+1].INT;
MEM[S+1].INT:=-MEM[S+1].INT;MEM[S+5].INT:=MEM[S+1].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;END{:391}
ELSE IF MEM[R+1].INT>-DESTX THEN MEM[R+1].INT:=-DESTX;END{:390};
END{:385};{392:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+6].INT-MEM[PP+2].INT;DEL2:=MEM[QQ+4].INT-MEM[PP+6].INT;
DEL3:=DESTY-MEM[QQ+4].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{393:}
BEGIN MEM[PP+2].INT:=-MEM[PP+2].INT;MEM[PP+6].INT:=-MEM[PP+6].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=-DESTY;MEM[PP].HH.B1:=MEM[PP].HH.B1+2;END{:393};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{394:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>2 THEN MEM[R].HH.B1:=MEM[R].HH.B1-2 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+2;
IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX ELSE IF MEM[R+1].INT<MEM[
PP+1].INT THEN MEM[R+1].INT:=MEM[PP+1].INT;
IF MEM[R+2].INT<MEM[PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
MEM[R+4].INT:=MEM[R+2].INT;MEM[R+2].INT:=-MEM[R+2].INT;
MEM[R+6].INT:=MEM[R+2].INT;MEM[QQ+4].INT:=-MEM[QQ+4].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{395:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT>DESTX THEN MEM[S+1].INT:=DESTX ELSE IF MEM[S+1].INT<MEM[
R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
IF MEM[S+2].INT<-DESTY THEN MEM[S+2].INT:=-DESTY;
IF MEM[S+2].INT<MEM[R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
MEM[S].HH.B1:=MEM[PP].HH.B1;MEM[S+4].INT:=MEM[S+2].INT;
MEM[S+2].INT:=-MEM[S+2].INT;MEM[S+6].INT:=MEM[S+2].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;END{:395}
ELSE IF MEM[R+2].INT>-DESTY THEN MEM[R+2].INT:=-DESTY;END{:394};END;
PP:=QQ;UNTIL PP=Q{:392};{396:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;{397:}
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+5].INT-MEM[PP+6].INT;DEL2:=MEM[QQ+3].INT-MEM[QQ+4].INT;
DEL3:=DESTX-DESTY-DEL2;DEL2:=DEL2-DEL1;
DEL1:=DEL1-(MEM[PP+1].INT-MEM[PP+2].INT){:397};{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{398:}BEGIN DEL:=MEM[PP+2].INT;
MEM[PP+2].INT:=MEM[PP+1].INT;MEM[PP+1].INT:=DEL;DEL:=MEM[PP+6].INT;
MEM[PP+6].INT:=MEM[PP+5].INT;MEM[PP+5].INT:=DEL;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;DEL1:=-DEL1;DEL2:=-DEL2;
DEL3:=-DEL3;DEL:=DESTX;DESTX:=DESTY;DESTY:=DEL;
MEM[PP].HH.B1:=MEM[PP].HH.B1+4;END{:398};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{399:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>4 THEN MEM[R].HH.B1:=MEM[R].HH.B1-4 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+4;
IF MEM[R+2].INT>DESTY THEN MEM[R+2].INT:=DESTY ELSE IF MEM[R+2].INT<MEM[
PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
IF MEM[R+1].INT-MEM[R+2].INT<MEM[PP+1].INT-MEM[PP+2].INT THEN MEM[R+1].
INT:=MEM[PP+1].INT-MEM[PP+2].INT+MEM[R+2].INT;
MEM[R+4].INT:=MEM[R+2].INT-(MEM[R+1].INT-MEM[R+3].INT);
DEL:=MEM[R+2].INT;MEM[R+2].INT:=MEM[R+1].INT;MEM[R+1].INT:=DEL;
MEM[R+6].INT:=MEM[R+5].INT;
MEM[R+5].INT:=MEM[R+1].INT+MEM[R+6].INT-MEM[R+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{400:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;MEM[S].HH.B1:=MEM[PP].HH.B1;
IF MEM[S+2].INT>DESTX THEN MEM[S+2].INT:=DESTX ELSE IF MEM[S+2].INT<MEM[
R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
IF MEM[S+1].INT-MEM[S+2].INT<DESTY-DESTX THEN MEM[S+1].INT:=MEM[S+2].INT
+DESTY-DESTX;
IF MEM[S+1].INT-MEM[S+2].INT<MEM[R+1].INT-MEM[R+2].INT THEN MEM[S+1].INT
:=MEM[R+1].INT-MEM[R+2].INT+MEM[S+2].INT;
MEM[S+4].INT:=MEM[S+2].INT-(MEM[S+1].INT-MEM[S+3].INT);
DEL:=MEM[S+2].INT;MEM[S+2].INT:=MEM[S+1].INT;MEM[S+1].INT:=DEL;
MEM[S+6].INT:=MEM[S+5].INT;
MEM[S+5].INT:=MEM[S+1].INT+MEM[S+6].INT-MEM[S+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;END{:400}
ELSE IF MEM[R+2].INT-MEM[R+1].INT<DESTX-DESTY THEN MEM[R+2].INT:=DESTX-
DESTY+MEM[R+1].INT;END{:399};END;PP:=QQ;UNTIL PP=Q{:396};P:=Q;
UNTIL P=H{:384};{401:}P:=H;REPEAT 22:Q:=MEM[P].HH.RH;
IF(P<>H)OR(Q<>H)THEN BEGIN IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2]
.INT=MEM[P+6].INT THEN IF MEM[P+1].INT=MEM[Q+3].INT THEN IF MEM[P+2].INT
=MEM[Q+4].INT THEN BEGIN UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1
);ROTATE(CURX,CURY,MEM[P].HH.B1);
IF MEM[P+1].INT=CURX THEN IF MEM[P+2].INT=CURY THEN BEGIN REMOVECUBIC(P)
;IF Q<>H THEN GOTO 22 ELSE BEGIN H:=P;Q:=P;END;END;END;END;P:=Q;
UNTIL P=H;{:401};{405:}WINDINGNUMBE:=0;P:=H;Q:=MEM[P].HH.RH;
REPEAT R:=MEM[Q].HH.RH;IF(MEM[P].HH.B1<>MEM[Q].HH.B1)OR(Q=R)THEN{407:}
BEGIN NEWBOUNDARY(P,MEM[P].HH.B1);S:=MEM[P].HH.RH;TURNAROUND:=FALSE;
O1:=OCTANTNUMBER[MEM[P].HH.B1];O2:=OCTANTNUMBER[MEM[Q].HH.B1];
CASE O2-O1 OF 1,-7,7,-1:GOTO 30;0,2,-6:CLOCKWISE:=FALSE;
3,-5,4,-4,5,-3:{409:}BEGIN{410:}DX1:=MEM[S+1].INT-MEM[S+3].INT;
DY1:=MEM[S+2].INT-MEM[S+4].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+5].INT;
DY1:=MEM[S+2].INT-MEM[P+6].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+1].INT;
DY1:=MEM[S+2].INT-MEM[P+2].INT;END;END;DMAX:=ABS(DX1);
IF ABS(DY1)>DMAX THEN DMAX:=ABS(DY1);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX1:=DX1+DX1;DY1:=DY1+DY1;
END;DX2:=MEM[Q+5].INT-MEM[Q+1].INT;DY2:=MEM[Q+6].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN DX2:=MEM[R+3].INT-MEM[Q+1].INT;
DY2:=MEM[R+4].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN UNROTATE(MEM[R+1].INT,MEM[R+2].INT,MEM
[R].HH.B1);ROTATE(CURX,CURY,MEM[Q].HH.B1);DX2:=CURX-MEM[Q+1].INT;
DY2:=CURY-MEM[Q+2].INT;END;END;DMAX:=ABS(DX2);
IF ABS(DY2)>DMAX THEN DMAX:=ABS(DY2);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX2:=DX2+DX2;DY2:=DY2+DY2;
END{:410};UNROTATE(DX1,DY1,MEM[P].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX1:=MAKEFRACTION(CURX,DEL);DY1:=MAKEFRACTION(CURY,DEL);
UNROTATE(DX2,DY2,MEM[Q].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX2:=MAKEFRACTION(CURX,DEL);DY2:=MAKEFRACTION(CURY,DEL);
DEL:=TAKEFRACTION(DX1,DY2)-TAKEFRACTION(DX2,DY1);
IF DEL>4684844 THEN CLOCKWISE:=FALSE ELSE IF DEL<-4684844 THEN CLOCKWISE
:=TRUE ELSE BEGIN CLOCKWISE:=FALSE;TURNAROUND:=TRUE;END;END{:409};
6,-2:CLOCKWISE:=TRUE;END;{411:}
WHILE TRUE DO BEGIN IF CLOCKWISE THEN IF O1=1 THEN O1:=8 ELSE O1:=O1-1
ELSE IF O1=8 THEN O1:=1 ELSE O1:=O1+1;IF O1=O2 THEN GOTO 30;
NEWBOUNDARY(S,OCTANTCODE[O1]);S:=MEM[S].HH.RH;
MEM[S+3].INT:=MEM[S+5].INT;END{:411};
30:IF Q=R THEN BEGIN Q:=MEM[Q].HH.RH;R:=Q;P:=S;MEM[S].HH.RH:=Q;
MEM[Q+3].INT:=MEM[Q+5].INT;MEM[Q].HH.B0:=0;FREENODE(H,7);H:=Q;END;{412:}
P:=MEM[P].HH.RH;REPEAT S:=MEM[P].HH.RH;O1:=OCTANTNUMBER[MEM[P+5].INT];
O2:=OCTANTNUMBER[MEM[S+3].INT];
IF ABS(O1-O2)=1 THEN BEGIN WINDINGNUMBE:=WINDINGNUMBE+O2-O1;
IF O2<O1 THEN O2:=O1;
IF ODD(O2)THEN MEM[P+6].INT:=0 ELSE MEM[P+6].INT:=2;
END ELSE BEGIN IF O1=8 THEN WINDINGNUMBE:=WINDINGNUMBE+1 ELSE
WINDINGNUMBE:=WINDINGNUMBE-1;MEM[P+6].INT:=0;END;
MEM[S+4].INT:=MEM[P+6].INT;IF INTERNAL[30]<=131072 THEN{413:}
BEGIN IF MEM[P].HH.B0<>0 THEN IF TURNAROUND OR((MEM[P+6].INT=0)AND(ABS(
MEM[P+4].INT-MEM[P+2].INT)>1))OR((MEM[P+6].INT=2)AND(ABS(MEM[P+3].INT-
MEM[P+4].INT-MEM[P+1].INT+MEM[P+2].INT)>1))THEN MEM[P+6].INT:=MEM[P+6].
INT+1;
IF MEM[S].HH.B1<>0 THEN IF TURNAROUND OR((MEM[S+4].INT=0)AND(ABS(MEM[S+6
].INT-MEM[S+2].INT)>1))OR((MEM[S+4].INT=2)AND(ABS(MEM[S+5].INT-MEM[S+6].
INT-MEM[S+1].INT+MEM[S+2].INT)>1))THEN MEM[S+4].INT:=MEM[S+4].INT+1;
END{:413};P:=S;UNTIL P=Q{:412};END{:407};P:=Q;Q:=R;UNTIL P=H;{:405};
WHILE MEM[H].HH.B0<>0 DO H:=MEM[H].HH.RH;
IF INTERNAL[4]>0 THEN PRINTSPEC(H,411);MAKESPEC:=H;END;{:381}{418:}
FUNCTION SKEW(P,Q:HALFWORD;XX0,YY0,XX1,YY1:SCALED):BOOLEAN;
VAR LAMBDA,MU:FRACTION;REASONABLE:BOOLEAN;
LAMBDANUM,LAMBDADENOM,MUNUM,MUDENOM,ALPHA,BETA:SCALED;BEGIN{419:}
MUNUM:=YY1-YY0;MUDENOM:=MEM[Q+2].INT-MEM[P+2].INT;LAMBDANUM:=XX1-XX0;
LAMBDADENOM:=MEM[Q+1].INT-MEM[P+1].INT-MUDENOM;
IF(LAMBDANUM<0)OR(MUNUM<0)OR((LAMBDANUM)DIV 2>=LAMBDADENOM)OR((MUNUM)DIV
2>=MUDENOM)THEN BEGIN LAMBDA:=268435456;MU:=268435456;ALPHA:=0;
BETA:=32768;REASONABLE:=FALSE;XX0:=MEM[P+1].INT-MEM[P+2].INT;
YY0:=MEM[P+2].INT+32768;
END ELSE BEGIN LAMBDA:=MAKEFRACTION(LAMBDANUM,LAMBDADENOM);
MU:=MAKEFRACTION(MUNUM,MUDENOM);
ALPHA:=XX0-TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA);
BETA:=YY0-TAKEFRACTION(MEM[P+2].INT,MU);REASONABLE:=TRUE;END;{:419};
MEM[P+1].INT:=XX0;MEM[P+2].INT:=YY0;
WHILE P<>Q DO BEGIN MEM[P+5].INT:=TAKEFRACTION(MEM[P+5].INT-MEM[P+6].INT
,LAMBDA)+ALPHA;MEM[P+6].INT:=TAKEFRACTION(MEM[P+6].INT,MU)+BETA;
P:=MEM[P].HH.RH;
MEM[P+3].INT:=TAKEFRACTION(MEM[P+3].INT-MEM[P+4].INT,LAMBDA)+ALPHA;
MEM[P+4].INT:=TAKEFRACTION(MEM[P+4].INT,MU)+BETA;
MEM[P+1].INT:=TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA)+ALPHA;
MEM[P+2].INT:=TAKEFRACTION(MEM[P+2].INT,MU)+BETA;END;SKEW:=REASONABLE;
END;{:418}{420:}PROCEDURE MAKEGOOD(X,Y:SCALED;TRANSITION:SMALLNUMBER;
INCOMING:BOOLEAN);VAR THETA,PHI,AVE:SCALED;XX,YY:SCALED;
BEGIN XX:=X+32768-XCORR[OCTANT];CURM:=FLOORUNSCALE(XX);CURX:=CURM*65536;
THETA:=XX-CURX;YY:=Y+32768-YCORR[OCTANT];CURN:=FLOORUNSCALE(YY);
CURY:=CURN*65536;PHI:=YY-CURY;
IF THETA>=PHI+GOOD1[OCTANT]THEN CURDD:=1 ELSE CURDD:=0;
IF TRANSITION=0 THEN BEGIN CURX:=X;
IF INTERNAL[30]>0 THEN IF THETA>=GOOD2[OCTANT]THEN CURD:=1 ELSE CURD:=0
ELSE BEGIN CURY:=Y;CURD:=CURDD;END;
END ELSE IF ODD(TRANSITION)OR(INTERNAL[30]<=65536)THEN BEGIN CURX:=X;
CURY:=Y;CURD:=CURDD;END ELSE{421:}
BEGIN AVE:=(THETA+PHI+GOOD3[OCTANT])DIV 2;
IF AVE<16385 THEN AVE:=16385 ELSE IF AVE>49150 THEN AVE:=49150;
IF INCOMING THEN PHI:=PHI+1;IF THETA<PHI THEN BEGIN THETA:=AVE-49152;
PHI:=AVE-16384;CURD:=0;END ELSE BEGIN THETA:=AVE-16384;PHI:=AVE-49152;
CURD:=1;END;CURX:=CURX+THETA;CURY:=CURY+PHI;END{:421};END;{:420}{424:}
PROCEDURE FILLSPEC(H:HALFWORD);VAR P,Q,R,S:HALFWORD;M0,N0,M1,N1:INTEGER;
XX0,YY0:SCALED;D0,DD0,D1:0..1;BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;
P:=H;REPEAT OCTANT:=MEM[P+3].INT;{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};IF Q<>P THEN BEGIN{426:}
MAKEGOOD(MEM[P+1].INT,MEM[P+2].INT,MEM[P+4].INT,TRUE);M0:=CURM;N0:=CURN;
D0:=CURD;DD0:=CURDD;XX0:=CURX-CURY;YY0:=CURY+32768;
MAKEGOOD(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q+6].INT,FALSE);M1:=CURM;
N1:=CURN;
IF SKEW(P,Q,XX0,YY0,CURX-CURY,CURY+32768)THEN D1:=CURD ELSE BEGIN D1:=
CURDD;D0:=DD0;END{:426};{427:}
IF N1-N0>=MOVESIZE THEN OVERFLOW(391,MOVESIZE);MOVE[0]:=D0;MOVEPTR:=0;
R:=P;REPEAT S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT,MEM[R+5].INT,MEM[S+3].INT,MEM[S+1].INT,MEM[R+2].
INT,MEM[R+6].INT,MEM[S+4].INT,MEM[S+2].INT,XYCORR[OCTANT],YCORR[OCTANT])
;R:=S;UNTIL R=Q;MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(0,MOVEPTR){:427};
MOVETOEDGES(M0,N0,M1,N1,OCTANT);END;P:=MEM[Q].HH.RH;UNTIL P=H;
TOSSKNOTLIST(H);IF INTERNAL[8]>0 THEN ENDEDGETRACI;END;{:424}{435:}
PROCEDURE DUPOFFSET(W:HALFWORD);VAR R:HALFWORD;BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[W+1].INT;MEM[R+2].INT:=MEM[W+2].INT;
MEM[R].HH.RH:=MEM[W].HH.RH;MEM[MEM[W].HH.RH].HH.LH:=R;MEM[R].HH.LH:=W;
MEM[W].HH.RH:=R;END;{:435}{436:}FUNCTION MAKEPEN(H:HALFWORD):HALFWORD;
LABEL 30,31,45,40;VAR O,OO,K:SMALLNUMBER;P:HALFWORD;
Q,R,S,W,WW,HH:HALFWORD;N:INTEGER;DX,DY:SCALED;MC:SCALED;BEGIN{438:}Q:=H;
R:=MEM[Q].HH.RH;MC:=ABS(MEM[H+1].INT);IF Q=R THEN BEGIN HH:=H;
MEM[H].HH.B1:=0;IF MC<ABS(MEM[H+2].INT)THEN MC:=ABS(MEM[H+2].INT);
END ELSE BEGIN O:=0;HH:=0;WHILE TRUE DO BEGIN S:=MEM[R].HH.RH;
IF MC<ABS(MEM[R+1].INT)THEN MC:=ABS(MEM[R+1].INT);
IF MC<ABS(MEM[R+2].INT)THEN MC:=ABS(MEM[R+2].INT);
DX:=MEM[R+1].INT-MEM[Q+1].INT;DY:=MEM[R+2].INT-MEM[Q+2].INT;
IF DX=0 THEN IF DY=0 THEN GOTO 45;
IF ABVSCD(DX,MEM[S+2].INT-MEM[R+2].INT,DY,MEM[S+1].INT-MEM[R+1].INT)<0
THEN GOTO 45;{439:}
IF DX>0 THEN OCTANT:=1 ELSE IF DX=0 THEN IF DY>0 THEN OCTANT:=1 ELSE
OCTANT:=2 ELSE BEGIN DX:=-DX;OCTANT:=2;END;IF DY<0 THEN BEGIN DY:=-DY;
OCTANT:=OCTANT+2;END ELSE IF DY=0 THEN IF OCTANT>1 THEN OCTANT:=4;
IF DX<DY THEN OCTANT:=OCTANT+4{:439};MEM[Q].HH.B1:=OCTANT;
OO:=OCTANTNUMBER[OCTANT];IF O>OO THEN BEGIN IF HH<>0 THEN GOTO 45;HH:=Q;
END;O:=OO;IF(Q=H)AND(HH<>0)THEN GOTO 30;Q:=R;R:=S;END;30:END{:438};
P:=GETNODE(10);Q:=HH;MEM[P+9].INT:=MC;MEM[P].HH.LH:=0;
FOR K:=1 TO 8 DO{440:}BEGIN OCTANT:=OCTANTCODE[K];N:=0;H:=P+OCTANT;
WHILE TRUE DO BEGIN R:=GETNODE(3);{441:}
CASE OCTANT OF 1:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
5:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
6:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
2:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
4:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;
8:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
7:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
3:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;END{:441};
IF N=0 THEN MEM[H].HH.RH:=R ELSE{442:}
IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;MEM[R].HH.LH:=W;
END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;END{:442};W:=R;
IF MEM[Q].HH.B1<>OCTANT THEN GOTO 31;Q:=MEM[Q].HH.RH;N:=N+1;END;
31:{443:}R:=MEM[H].HH.RH;IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;
MEM[R].HH.LH:=W;END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;
MEM[H].HH.RH:=W;R:=W;END;
IF(MEM[R+2].INT<>MEM[MEM[R].HH.RH+2].INT)OR(N=0)THEN BEGIN DUPOFFSET(R);
N:=N+1;END;R:=MEM[R].HH.LH;
IF MEM[R+1].INT<>MEM[MEM[R].HH.LH+1].INT THEN DUPOFFSET(R)ELSE N:=N-1{:
443};MEM[H].HH.LH:=N;END{:440};GOTO 40;45:P:=3;{437:}
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(421);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=422;HELPLINE[1]:=423;HELPLINE[0]:=424;END;
ERROR{:437};40:IF INTERNAL[5]>0 THEN PRINTPEN(P,420);MAKEPEN:=P;END;
{:436}{445:}PROCEDURE FINDOFFSET(X,Y:SCALED;P:HALFWORD);LABEL 30,10;
VAR OCTANT:1..8;S:-1..+1;N:INTEGER;H,W,WW:HALFWORD;BEGIN{446:}
IF X>0 THEN OCTANT:=1 ELSE IF X=0 THEN IF Y<=0 THEN IF Y=0 THEN BEGIN
CURX:=0;CURY:=0;GOTO 10;
END ELSE OCTANT:=2 ELSE OCTANT:=1 ELSE BEGIN X:=-X;
IF Y=0 THEN OCTANT:=4 ELSE OCTANT:=2;END;
IF Y<0 THEN BEGIN OCTANT:=OCTANT+2;Y:=-Y;END;
IF X>=Y THEN X:=X-Y ELSE BEGIN OCTANT:=OCTANT+4;X:=Y-X;Y:=Y-X;END{:446};
IF ODD(OCTANTNUMBER[OCTANT])THEN S:=-1 ELSE S:=+1;H:=P+OCTANT;
W:=MEM[MEM[H].HH.RH].HH.RH;WW:=MEM[W].HH.RH;N:=MEM[H].HH.LH;
WHILE N>1 DO BEGIN IF ABVSCD(X,MEM[WW+2].INT-MEM[W+2].INT,Y,MEM[WW+1].
INT-MEM[W+1].INT)<>S THEN GOTO 30;W:=WW;WW:=MEM[W].HH.RH;N:=N-1;END;
30:UNROTATE(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT,OCTANT);10:END;{:445}
{448:}{450:}PROCEDURE SPLITFOROFFS(P:HALFWORD;T:FRACTION);
VAR Q:HALFWORD;R:HALFWORD;S:QUARTERWORD;BEGIN Q:=MEM[P].HH.RH;
S:=MEM[Q].HH.B1;MEM[Q].HH.B1:=1;MEM[P].HH.B1:=1;SPLITCUBIC(P,T);
MEM[Q].HH.B1:=S;R:=MEM[P].HH.RH;
IF MEM[R+2].INT<MEM[P+2].INT THEN MEM[R+2].INT:=MEM[P+2].INT ELSE IF MEM
[R+2].INT>MEM[Q+2].INT THEN MEM[R+2].INT:=MEM[Q+2].INT;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT ELSE IF MEM
[R+1].INT>MEM[Q+1].INT THEN MEM[R+1].INT:=MEM[Q+1].INT;END;{:450}{454:}
PROCEDURE FINOFFSETPRE(P:HALFWORD;K:HALFWORD;W:HALFWORD;
X0,X1,X2,Y0,Y1,Y2:INTEGER;RISING:BOOLEAN;N:INTEGER);LABEL 10;
VAR Q,WW:HALFWORD;DU,DV:SCALED;T0,T1,T2:INTEGER;T:FRACTION;S:FRACTION;
V:INTEGER;BEGIN WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=K;
IF RISING THEN IF K=N THEN GOTO 10 ELSE WW:=MEM[W].HH.RH ELSE IF K=1
THEN GOTO 10 ELSE WW:=MEM[W].HH.LH;{455:}DU:=MEM[WW+1].INT-MEM[W+1].INT;
DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:455};T:=CROSSINGPOIN(T0,T1,T2);
IF T>=268435456 THEN GOTO 10;{456:}BEGIN SPLITFOROFFS(P,T);
MEM[P].HH.B1:=K;P:=MEM[P].HH.RH;V:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X0:=V-TAKEFRACTION(V-X1,T);
V:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y0:=V-TAKEFRACTION(V-Y1,T);T1:=T1-TAKEFRACTION(T1-T2,T);
IF T1>0 THEN T1:=0;T:=CROSSINGPOIN(0,-T1,-T2);
IF T<268435456 THEN BEGIN SPLITFOROFFS(P,T);MEM[MEM[P].HH.RH].HH.B1:=K;
V:=X1-TAKEFRACTION(X1-X2,T);X1:=X0-TAKEFRACTION(X0-X1,T);
X2:=X1-TAKEFRACTION(X1-V,T);V:=Y1-TAKEFRACTION(Y1-Y2,T);
Y1:=Y0-TAKEFRACTION(Y0-Y1,T);Y2:=Y1-TAKEFRACTION(Y1-V,T);END;END{:456};
IF RISING THEN K:=K+1 ELSE K:=K-1;W:=WW;END;10:END;{:454}
PROCEDURE OFFSETPREP(C,H:HALFWORD);LABEL 30;VAR N:HALFWO∀D;
P,Q,R,LH,WW:HALFWORD;K:HALFWORD;W:HALFWORD;{452:}
X0,X1,X2,Y0,Y1,Y2:INTEGER;T0,T1,T2:INTEGER;DU,DV,DX,DY:INTEGER;
MAXCOEF:INTEGER;X0A,X1A,X2A,Y0A,Y1A,Y2A:INTEGER;T:FRACTION;S:FRACTION;
{:452}BEGIN P:=C;N:=MEM[H].HH.LH;LH:=MEM[H].HH.RH;
WHILE MEM[P].HH.B1<>0 DO BEGIN Q:=MEM[P].HH.RH;{451:}
IF N<=1 THEN MEM[P].HH.B1:=1 ELSE BEGIN{453:}
X0:=MEM[P+5].INT-MEM[P+1].INT;X2:=MEM[Q+1].INT-MEM[Q+3].INT;
X1:=MEM[Q+3].INT-MEM[P+5].INT;Y0:=MEM[P+6].INT-MEM[P+2].INT;
Y2:=MEM[Q+2].INT-MEM[Q+4].INT;Y1:=MEM[Q+4].INT-MEM[P+6].INT;
MAXCOEF:=ABS(X0);IF ABS(X1)>MAXCOEF THEN MAXCOEF:=ABS(X1);
IF ABS(X2)>MAXCOEF THEN MAXCOEF:=ABS(X2);
IF ABS(Y0)>MAXCOEF THEN MAXCOEF:=ABS(Y0);
IF ABS(Y1)>MAXCOEF THEN MAXCOEF:=ABS(Y1);
IF ABS(Y2)>MAXCOEF THEN MAXCOEF:=ABS(Y2);
WHILE MAXCOEF<268435456 DO BEGIN MAXCOEF:=MAXCOEF+MAXCOEF;X0:=X0+X0;
X1:=X1+X1;X2:=X2+X2;Y0:=Y0+Y0;Y1:=Y1+Y1;Y2:=Y2+Y2;END;{:453};{458:}
DX:=X0;DY:=Y0;IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X1;DY:=Y1;
IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X2;DY:=Y2;END;END{:458};
IF DX=0 THEN{462:}
FINOFFSETPRE(P,N,MEM[MEM[LH].HH.LH].HH.LH,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,
N){:462}ELSE BEGIN{459:}K:=1;W:=MEM[LH].HH.RH;
WHILE TRUE DO BEGIN IF K=N THEN GOTO 30;WW:=MEM[W].HH.RH;
IF ABVSCD(DY,ABS(MEM[WW+1].INT-MEM[W+1].INT),DX,ABS(MEM[WW+2].INT-MEM[W
+2].INT))>=0 THEN BEGIN K:=K+1;W:=WW;END ELSE GOTO 30;END;30:{:459};
{460:}IF K=1 THEN T:=268435457 ELSE BEGIN WW:=MEM[W].HH.LH;{455:}
DU:=MEM[WW+1].INT-MEM[W+1].INT;DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:455};T:=CROSSINGPOIN(-T0,-T1,-T2);END;
IF T>=268435456 THEN FINOFFSETPRE(P,K,W,X0,X1,X2,Y0,Y1,Y2,TRUE,N)ELSE
BEGIN SPLITFOROFFS(P,T);R:=MEM[P].HH.RH;X1A:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X2A:=X1A-TAKEFRACTION(X1A-X1,T);
Y1A:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y2A:=Y1A-TAKEFRACTION(Y1A-Y1,T);
FINOFFSETPRE(P,K,W,X0,X1A,X2A,Y0,Y1A,Y2A,TRUE,N);X0:=X2A;Y0:=Y2A;
T1:=T1-TAKEFRACTION(T1-T2,T);IF T1<0 THEN T1:=0;
T:=CROSSINGPOIN(0,T1,T2);IF T<268435456 THEN{461:}
BEGIN SPLITFOROFFS(R,T);X1A:=X1-TAKEFRACTION(X1-X2,T);
X1:=X0-TAKEFRACTION(X0-X1,T);X0A:=X1-TAKEFRACTION(X1-X1A,T);
Y1A:=Y1-TAKEFRACTION(Y1-Y2,T);Y1:=Y0-TAKEFRACTION(Y0-Y1,T);
Y0A:=Y1-TAKEFRACTION(Y1-Y1A,T);
FINOFFSETPRE(MEM[R].HH.RH,K,W,X0A,X1A,X2,Y0A,Y1A,Y2,TRUE,N);X2:=X0A;
Y2:=Y0A;END{:461};
FINOFFSETPRE(R,K-1,WW,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,N);END{:460};END;
END{:451};{449:}REPEAT R:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2].INT=MEM[P+6].INT THEN IF
MEM[P+1].INT=MEM[R+3].INT THEN IF MEM[P+2].INT=MEM[R+4].INT THEN IF MEM[
P+1].INT=MEM[R+1].INT THEN IF MEM[P+2].INT=MEM[R+2].INT THEN BEGIN
REMOVECUBIC(P);IF R=Q THEN Q:=P;R:=P;END;P:=R;UNTIL P=Q{:449};END;END;
{:448}{463:}{469:}PROCEDURE SKEWLINEEDGE(X0,Y0,X1,Y1:SCALED);
BEGIN UNROTATE(X0+Y0-32768,Y0-32768,OCTANT);X0:=CURX;Y0:=CURY;
UNROTATE(X1+Y1-32768,Y1-32768,OCTANT);
IF INTERNAL[32]>0 THEN BEGIN PRINTNL(431);PRINTTWO(X0,Y0);PRINT(429);
PRINTTWO(CURX,CURY);PRINTLN;END;LINEEDGES(X0,Y0,CURX,CURY);END;{:469}
PROCEDURE FILLENVELOPE(SPECHEAD,PENHEAD:HALFWORD);LABEL 30,31,32,33;
VAR P,Q,R,S:HALFWORD;H:HALFWORD;M0,N0,M1,N1:INTEGER;X0,Y0,X1,Y1:SCALED;
D0,DD0,D1:0..1;XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;{466:}
XX0,YY0,XX1,YY1:SCALED;MM0,NN0,MM1,NN1:INTEGER;M,N:INTEGER;K:INTEGER;
W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;{:466}
BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;P:=SPECHEAD;
REPEAT OCTANT:=MEM[P+3].INT;H:=PENHEAD+OCTANT;{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};{464:}X0:=MEM[P+1].INT;
Y0:=MEM[P+2].INT;X1:=MEM[Q+1].INT;Y1:=MEM[Q+2].INT;W:=MEM[H].HH.RH;
IF MEM[P+4].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[32]>0 THEN BEGIN PRINTNL(425);
PRINTINT(OCTANTNUMBER[OCTANT]);PRINT(426);PRINTINT(MEM[H].HH.LH);
PRINT(427);IF MEM[H].HH.LH<>1 THEN PRINTCHAR(115);
UNROTATE(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,OCTANT);
PRINT(428);PRINTTWO(CURX,CURY);WW:=W;END;
MAKEGOOD(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,MEM[P+4].INT,TRUE)
;M0:=CURM;N0:=CURN;D0:=CURD;DD0:=CURDD;XX:=(CURX-CURY)-MEM[W+1].INT;
YY:=CURY+32768-MEM[W+2].INT;W:=MEM[H].HH.RH;
IF MEM[Q+6].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[32]>0 THEN BEGIN PRINT(429);
UNROTATE(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END;
MAKEGOOD(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,MEM[Q+6].INT,FALSE
);M1:=CURM;N1:=CURN;
IF SKEW(P,Q,XX,YY,CURX-CURY-MEM[W+1].INT,CURY+32768-MEM[W+2].INT)THEN
BEGIN D1:=CURD;IF INTERNAL[32]>0 THEN BEGIN PRINTNL(430);
UNROTATE(MEM[P+1].INT+MEM[P+2].INT-32768+MEM[WW+1].INT+MEM[WW+2].INT,MEM
[P+2].INT-32768+MEM[WW+2].INT,OCTANT);PRINTTWO(CURX,CURY);PRINT(429);
UNROTATE(MEM[Q+1].INT+MEM[Q+2].INT-32768+MEM[W+1].INT+MEM[W+2].INT,MEM[Q
+2].INT-32768+MEM[W+2].INT,OCTANT);PRINTTWO(CURX,CURY);END;
END ELSE BEGIN D1:=CURDD;D0:=DD0;END{:464};OFFSETPREP(P,H);{425:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:425};{467:}
IF ODD(OCTANTNUMBER[OCTANT])THEN BEGIN{468:}K:=0;W:=MEM[H].HH.RH;
WW:=MEM[W].HH.LH;XX0:=MEM[P+1].INT+MEM[W+1].INT;
YY0:=MEM[P+2].INT+MEM[W+2].INT;IF MEM[P+4].INT>=2 THEN{470:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:470};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(391,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=0 TO NN1-NN0 DO ENVMOVE[N]:=MM0;ENVMOVE[NN1-NN0]:=MM1;MOVEPTR:=0;
M:=MM0{:468};R:=P;MEM[Q].HH.B1:=MEM[H].HH.LH+1;
WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{472:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;IF INTERNAL[32]>0 THEN BEGIN PRINTNL(432);
PRINTINT(K);PRINT(433);UNROTATE(XX+YY-32768,YY-32768,OCTANT);
PRINTTWO(CURX,CURY);END;IF MEM[R].HH.B1>K THEN BEGIN K:=K+1;
W:=MEM[W].HH.RH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT;IF YP<>YY THEN{473:}
BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;YY:=YY-TY;
TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TY:=TY-65536;IF TY<65536 THEN GOTO 31;YY:=YY+65536;MOVEPTR:=MOVEPTR+1;
END;31:END;END{:473};END ELSE BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[32]>0 THEN BEGIN PRINT(429);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTLN;END;
M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:472};
IF R=Q THEN GOTO 30;IF R=P THEN SMOOTHBOT:=MOVEPTR;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{471:}REPEAT M:=M+MOVE[N]-1;
IF M>ENVMOVE[N]THEN ENVMOVE[N]:=M;N:=N+1;UNTIL N>MOVEPTR{:471};R:=S;END;
30:{474:}IF MEM[Q+6].INT<2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(49);
MOVE[0]:=D0+ENVMOVE[0]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N]-ENVMOVE[N-1]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT<2 THEN BEGIN WW:=MEM[H].HH.RH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:474};END ELSE{475:}BEGIN{476:}K:=MEM[H].HH.LH+1;
WW:=MEM[H].HH.RH;W:=MEM[WW].HH.LH;XX0:=MEM[P+1].INT+MEM[W+1].INT;
YY0:=MEM[P+2].INT+MEM[W+2].INT;IF MEM[P+4].INT<2 THEN{470:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:470};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(391,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=1 TO NN1-NN0+1 DO ENVMOVE[N]:=MM1;ENVMOVE[0]:=MM0;MOVEPTR:=0;
M:=MM0{:476};R:=P;WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{478:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;IF INTERNAL[32]>0 THEN BEGIN PRINTNL(432);
PRINTINT(K);PRINT(433);UNROTATE(XX+YY-32768,YY-32768,OCTANT);
PRINTTWO(CURX,CURY);END;IF MEM[R].HH.B1<K THEN BEGIN K:=K-1;
W:=MEM[W].HH.LH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT;IF YP<>YY THEN{479:}
BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;YY:=YY-TY;
TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);TY:=TY-65536;MOVEPTR:=MOVEPTR+1;
IF TY<65536 THEN GOTO 32;YY:=YY+65536;END;
32:IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END;END{:479};
END ELSE BEGIN K:=K+1;W:=MEM[W].HH.RH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[32]>0 THEN BEGIN PRINT(429);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTLN;END;
M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:478};
IF R=Q THEN GOTO 33;IF R=P THEN SMOOTHBOT:=MOVEPTR;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{477:}
REPEAT IF M<ENVMOVE[N]THEN ENVMOVE[N]:=M;M:=M+MOVE[N]-1;N:=N+1;
UNTIL N>MOVEPTR{:477};R:=S;END;33:{480:}
IF MEM[Q+6].INT>=2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(50);
MOVE[0]:=D0+ENVMOVE[1]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N+1]-ENVMOVE[N]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT>=2 THEN BEGIN WW:=MEM[MEM[H].HH.RH].HH.LH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:480};END{:475};MEM[Q].HH.B1:=0{:467};P:=MEM[Q].HH.RH;
UNTIL P=SPECHEAD;IF INTERNAL[8]>0 THEN ENDEDGETRACI;
TOSSKNOTLIST(SPECHEAD);END;{:463}{484:}
FUNCTION MAKEELLIPSE(MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE):HALFWORD;
LABEL 30,40;VAR P,Q,R,S:HALFWORD;H:HALFWORD;
ALPHA,BETA,GAMMA,DELTA:INTEGER;C,D:INTEGER;U,V:INTEGER;BEGIN{485:}
P:=GETNODE(7);Q:=GETNODE(7);R:=GETNODE(7);S:=GETNODE(7);H:=P;
MEM[P].HH.RH:=Q;MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;{487:}
IF(THETA=0)OR(MAJORAXIS=MINORAXIS)THEN BEGIN ALPHA:=0;BETA:=MINORAXIS;
GAMMA:=MAJORAXIS;END ELSE BEGIN NSINCOS(THETA);
GAMMA:=TAKEFRACTION(MAJORAXIS,NSIN);DELTA:=TAKEFRACTION(MINORAXIS,NCOS);
BETA:=PYTHADD(GAMMA,DELTA);
ALPHA:=TAKEFRACTION(TAKEFRACTION(MAJORAXIS,MAKEFRACTION(GAMMA,BETA)),
NCOS)-TAKEFRACTION(TAKEFRACTION(MINORAXIS,MAKEFRACTION(DELTA,BETA)),NSIN
);ALPHA:=(ALPHA+32768)DIV 65536;
GAMMA:=PYTHADD(TAKEFRACTION(MAJORAXIS,NCOS),TAKEFRACTION(MINORAXIS,NSIN)
);END;BETA:=(BETA+32768)DIV 65536;GAMMA:=(GAMMA+32768)DIV 65536{:487};
{486:}IF BETA=0 THEN BETA:=1;IF GAMMA=0 THEN GAMMA:=1;
IF GAMMA<=ABS(ALPHA)THEN IF ALPHA>0 THEN ALPHA:=GAMMA-1 ELSE ALPHA:=1-
GAMMA{:486};MEM[S+1].INT:=ALPHA*32768;MEM[P+1].INT:=-MEM[S+1].INT;
MEM[S+2].INT:=BETA*32768;MEM[P+2].INT:=-MEM[S+2].INT;
MEM[Q+2].INT:=MEM[P+2].INT;MEM[R+2].INT:=MEM[S+2].INT;
MEM[Q+1].INT:=GAMMA*32768;MEM[R+1].INT:=MEM[Q+1].INT;MEM[P+5].INT:=0;
MEM[Q+3].INT:=-32768;MEM[Q+5].INT:=32768;MEM[R+3].INT:=0;
MEM[R+5].INT:=0;MEM[S+3].INT:=32768;MEM[P+6].INT:=BETA;
MEM[Q+6].INT:=GAMMA;MEM[R+6].INT:=BETA;MEM[Q+4].INT:=GAMMA+ALPHA;
MEM[R+4].INT:=BETA+BETA;MEM[S+4].INT:=GAMMA-ALPHA{:485};{488:}
WHILE TRUE DO BEGIN U:=MEM[P+5].INT+MEM[Q+5].INT;
V:=MEM[Q+3].INT+MEM[R+3].INT;C:=MEM[P+6].INT+MEM[Q+6].INT;{490:}
DELTA:=PYTHADD(U,V);
IF MAJORAXIS=MINORAXIS THEN D:=MAJORAXIS ELSE BEGIN IF THETA=0 THEN
BEGIN ALPHA:=U;BETA:=V;
END ELSE BEGIN ALPHA:=TAKEFRACTION(U,NCOS)+TAKEFRACTION(V,NSIN);
BETA:=TAKEFRACTION(V,NCOS)-TAKEFRACTION(U,NSIN);END;
ALPHA:=MAKEFRACTION(ALPHA,DELTA);BETA:=MAKEFRACTION(BETA,DELTA);
D:=PYTHADD(TAKEFRACTION(MAJORAXIS,ALPHA),TAKEFRACTION(MINORAXIS,BETA));
END;D:=TAKEFRACTION((D+4)DIV 8,DELTA);
IF ABS(U)>=ABS(V)THEN ALPHA:=ABS(U)DIV 32768 ELSE ALPHA:=ABS(V)DIV 32768
;IF D<ALPHA THEN D:=ALPHA{:490};DELTA:=C-D;
IF DELTA>0 THEN BEGIN IF DELTA>MEM[R+4].INT THEN DELTA:=MEM[R+4].INT;
IF DELTA>=MEM[Q+4].INT THEN{491:}BEGIN DELTA:=MEM[Q+4].INT;
MEM[P+6].INT:=C-DELTA;MEM[P+5].INT:=U;MEM[Q+3].INT:=V;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:491}ELSE{492:}BEGIN S:=GETNODE(7);
MEM[P].HH.RH:=S;MEM[S].HH.RH:=Q;
MEM[S+1].INT:=MEM[Q+1].INT+DELTA*MEM[Q+3].INT;
MEM[S+2].INT:=MEM[Q+2].INT-DELTA*MEM[P+5].INT;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[S+3].INT:=MEM[Q+3].INT;MEM[S+5].INT:=U;MEM[Q+3].INT:=V;
MEM[S+6].INT:=C-DELTA;MEM[S+4].INT:=MEM[Q+4].INT-DELTA;
MEM[Q+4].INT:=DELTA;MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:492};
END ELSE P:=Q;{489:}WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF Q=0 THEN GOTO 30;
IF MEM[Q+4].INT=0 THEN BEGIN MEM[P].HH.RH:=MEM[Q].HH.RH;
MEM[P+6].INT:=MEM[Q+6].INT;MEM[P+5].INT:=MEM[Q+5].INT;FREENODE(Q,7);
END ELSE BEGIN R:=MEM[Q].HH.RH;IF R=0 THEN GOTO 30;
IF MEM[R+4].INT=0 THEN BEGIN MEM[P].HH.RH:=R;FREENODE(Q,7);P:=R;
END ELSE GOTO 40;END;END;40:{:489};END;30:{:488};{493:}
IF Q<>0 THEN BEGIN IF MEM[H+5].INT=0 THEN BEGIN P:=H;H:=MEM[H].HH.RH;
FREENODE(P,7);MEM[Q+1].INT:=-MEM[H+1].INT;END;P:=Q;END ELSE Q:=P;
R:=MEM[H].HH.RH;REPEAT S:=GETNODE(7);MEM[P].HH.RH:=S;P:=S;
MEM[P+1].INT:=-MEM[R+1].INT;MEM[P+2].INT:=-MEM[R+2].INT;R:=MEM[R].HH.RH;
UNTIL R=Q;MEM[P].HH.RH:=H{:493};MAKEELLIPSE:=H;END;{:484}{495:}
FUNCTION FINDDIRECTIO(X,Y:SCALED;H:HALFWORD):SCALED;LABEL 10,40,45,30;
VAR MAX:SCALED;P,Q:HALFWORD;N:SCALED;TT:SCALED;{498:}
X1,X2,X3,Y1,Y2,Y3:SCALED;THETA,PHI:ANGLE;T:FRACTION;{:498}BEGIN{496:}
IF ABS(X)<ABS(Y)THEN BEGIN X:=MAKEFRACTION(X,ABS(Y));
IF Y>0 THEN Y:=268435456 ELSE Y:=-268435456;
END ELSE IF X=0 THEN BEGIN FINDDIRECTIO:=0;GOTO 10;
END ELSE BEGIN Y:=MAKEFRACTION(Y,ABS(X));
IF X>0 THEN X:=268435456 ELSE X:=-268435456;END{:496};N:=0;P:=H;
WHILE TRUE DO BEGIN IF MEM[P].HH.B1=0 THEN GOTO 45;Q:=MEM[P].HH.RH;
{497:}TT:=0;{499:}X1:=MEM[P+5].INT-MEM[P+1].INT;
X2:=MEM[Q+3].INT-MEM[P+5].INT;X3:=MEM[Q+1].INT-MEM[Q+3].INT;
Y1:=MEM[P+6].INT-MEM[P+2].INT;Y2:=MEM[Q+4].INT-MEM[P+6].INT;
Y3:=MEM[Q+2].INT-MEM[Q+4].INT;MAX:=ABS(X1);
IF ABS(X2)>MAX THEN MAX:=ABS(X2);IF ABS(X3)>MAX THEN MAX:=ABS(X3);
IF ABS(Y1)>MAX THEN MAX:=ABS(Y1);IF ABS(Y2)>MAX THEN MAX:=ABS(Y2);
IF ABS(Y3)>MAX THEN MAX:=ABS(Y3);IF MAX=0 THEN GOTO 40;
WHILE MAX<134217728 DO BEGIN MAX:=MAX+MAX;X1:=X1+X1;X2:=X2+X2;X3:=X3+X3;
Y1:=Y1+Y1;Y2:=Y2+Y2;Y3:=Y3+Y3;END;T:=X1;
X1:=TAKEFRACTION(X1,X)+TAKEFRACTION(Y1,Y);
Y1:=TAKEFRACTION(Y1,X)-TAKEFRACTION(T,Y);T:=X2;
X2:=TAKEFRACTION(X2,X)+TAKEFRACTION(Y2,Y);
Y2:=TAKEFRACTION(Y2,X)-TAKEFRACTION(T,Y);T:=X3;
X3:=TAKEFRACTION(X3,X)+TAKEFRACTION(Y3,Y);
Y3:=TAKEFRACTION(Y3,X)-TAKEFRACTION(T,Y){:499};
IF Y1=0 THEN IF X1>=0 THEN GOTO 40;IF N>0 THEN BEGIN{500:}
THETA:=NARG(X1,Y1);
IF THETA>=0 THEN IF PHI<=0 THEN IF PHI>=THETA-188743680 THEN GOTO 40;
IF THETA<=0 THEN IF PHI>=0 THEN IF PHI<=THETA+188743680 THEN GOTO 40{:
500};IF P=H THEN GOTO 45;END;PHI:=NARG(X3,Y3);{502:}
IF X1<0 THEN IF X2<0 THEN IF X3<0 THEN GOTO 30;
IF ABVSCD(Y1,Y3,Y2,Y2)=0 THEN{504:}
BEGIN IF ABVSCD(Y1,Y2,0,0)<0 THEN BEGIN T:=MAKEFRACTION(Y1,Y1-Y2);
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;
END;END ELSE IF Y1=0 THEN IF Y3=0 THEN{505:}
BEGIN T:=CROSSINGPOIN(-X1,-X2,-X3);
IF T<=268435456 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;
IF ABVSCD(X1,X3,X2,X2)=0 THEN BEGIN T:=MAKEFRACTION(X1,X1-X2);
BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END;END{:505};GOTO 30;END{:504};
IF Y1<=0 THEN IF Y1<0 THEN BEGIN Y1:=-Y1;Y2:=-Y2;Y3:=-Y3;
END ELSE IF Y2>0 THEN BEGIN Y2:=-Y2;Y3:=-Y3;END;{503:}
T:=CROSSINGPOIN(Y1,Y2,Y3);IF T>268435456 THEN GOTO 30;
Y2:=Y2-TAKEFRACTION(Y2-Y3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
X2:=X2-TAKEFRACTION(X2-X3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
IF X1>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;IF Y2>0 THEN Y2:=0;
TT:=T;T:=CROSSINGPOIN(0,-Y2,-Y3);IF T>268435456 THEN GOTO 30;
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN T:=TT-TAKEFRACTION(TT
-268435456,T);BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END{:503};30:{:502}
{:497};P:=Q;N:=N+65536;END;45:FINDDIRECTIO:=-65536;GOTO 10;
40:FINDDIRECTIO:=N+TT;10:END;{:495}{511:}
PROCEDURE CUBICINTERSE(P,PP:HALFWORD);LABEL 22,45,10;
VAR DELX,DELY:INTEGER;UV,XY:0..BISTACKSIZE;Q,QQ:HALFWORD;BEGIN{512:}
Q:=MEM[P].HH.RH;QQ:=MEM[PP].HH.RH;BISECTPTR:=20;
BISECTSTACK[BISECTPTR-5]:=MEM[P+5].INT-MEM[P+1].INT;
BISECTSTACK[BISECTPTR-4]:=MEM[Q+3].INT-MEM[P+5].INT;
BISECTSTACK[BISECTPTR-3]:=MEM[Q+1].INT-MEM[Q+3].INT;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-10]:=MEM[P+6].INT-MEM[P+2].INT;
BISECTSTACK[BISECTPTR-9]:=MEM[Q+4].INT-MEM[P+6].INT;
BISECTSTACK[BISECTPTR-8]:=MEM[Q+2].INT-MEM[Q+4].INT;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-15]:=MEM[PP+5].INT-MEM[PP+1].INT;
BISECTSTACK[BISECTPTR-14]:=MEM[QQ+3].INT-MEM[PP+5].INT;
BISECTSTACK[BISECTPTR-13]:=MEM[QQ+1].INT-MEM[QQ+3].INT;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-20]:=MEM[PP+6].INT-MEM[PP+2].INT;
BISECTSTACK[BISECTPTR-19]:=MEM[QQ+4].INT-MEM[PP+6].INT;
BISECTSTACK[BISECTPTR-18]:=MEM[QQ+2].INT-MEM[QQ+4].INT;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
DELX:=MEM[P+1].INT-MEM[PP+1].INT;DELY:=MEM[P+2].INT-MEM[PP+2].INT;
UV:=BISECTPTR;XY:=BISECTPTR;CURT:=1;CURTT:=1{:512};
WHILE TRUE DO BEGIN 22:IF DELX<=BISECTSTACK[XY-11]-BISECTSTACK[UV-2]THEN
IF DELX>=BISECTSTACK[XY-12]-BISECTSTACK[UV-1]THEN IF DELY<=BISECTSTACK[
XY-16]-BISECTSTACK[UV-7]THEN IF DELY>=BISECTSTACK[XY-17]-BISECTSTACK[UV
-6]THEN BEGIN IF CURT>=131072 THEN BEGIN CURT:=(CURT+1)DIV 2;
CURTT:=(CURTT+1)DIV 2;GOTO 10;END;{513:}BISECTSTACK[BISECTPTR]:=DELX;
BISECTSTACK[BISECTPTR+1]:=DELY;BISECTSTACK[BISECTPTR+2]:=UV;
BISECTSTACK[BISECTPTR+3]:=XY;BISECTPTR:=BISECTPTR+44;CURT:=CURT+CURT;
CURTT:=CURTT+CURTT;BISECTSTACK[BISECTPTR-25]:=BISECTSTACK[UV-5];
BISECTSTACK[BISECTPTR-3]:=BISECTSTACK[UV-3];
BISECTSTACK[BISECTPTR-24]:=(BISECTSTACK[BISECTPTR-25]+BISECTSTACK[UV-4])
DIV 2;
BISECTSTACK[BISECTPTR-4]:=(BISECTSTACK[BISECTPTR-3]+BISECTSTACK[UV-4])
DIV 2;BISECTSTACK[BISECTPTR-23]:=(BISECTSTACK[BISECTPTR-24]+BISECTSTACK[
BISECTPTR-4])DIV 2;BISECTSTACK[BISECTPTR-5]:=BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-25]<0 THEN IF BISECTSTACK[BISECTPTR-23]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-24]<0 THEN BISECTSTACK[BISECTPTR-22]:=
BISECTSTACK[BISECTPTR-25]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-23]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-24]>0 THEN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25
]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[
BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;END;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-30]:=BISECTSTACK[UV-10];
BISECTSTACK[BISECTPTR-8]:=BISECTSTACK[UV-8];
BISECTSTACK[BISECTPTR-29]:=(BISECTSTACK[BISECTPTR-30]+BISECTSTACK[UV-9])
DIV 2;
BISECTSTACK[BISECTPTR-9]:=(BISECTSTACK[BISECTPTR-8]+BISECTSTACK[UV-9])
DIV 2;BISECTSTACK[BISECTPTR-28]:=(BISECTSTACK[BISECTPTR-29]+BISECTSTACK[
BISECTPTR-9])DIV 2;BISECTSTACK[BISECTPTR-10]:=BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-30]<0 THEN IF BISECTSTACK[BISECTPTR-28]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-29]<0 THEN BISECTSTACK[BISECTPTR-27]:=
BISECTSTACK[BISECTPTR-30]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-28]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-29]>0 THEN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30
]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[
BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;END;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-35]:=BISECTSTACK[XY-15];
BISECTSTACK[BISECTPTR-13]:=BISECTSTACK[XY-13];
BISECTSTACK[BISECTPTR-34]:=(BISECTSTACK[BISECTPTR-35]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-14]:=(BISECTSTACK[BISECTPTR-13]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-33]:=(BISECTSTACK[BISECTPTR-34]+BISECTSTACK[
BISECTPTR-14])DIV 2;
BISECTSTACK[BISECTPTR-15]:=BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-35]<0 THEN IF BISECTSTACK[BISECTPTR-33]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-34]<0 THEN BISECTSTACK[BISECTPTR-32]:=
BISECTSTACK[BISECTPTR-35]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-33]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-34]>0 THEN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35
]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[
BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;END;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-40]:=BISECTSTACK[XY-20];
BISECTSTACK[BISECTPTR-18]:=BISECTSTACK[XY-18];
BISECTSTACK[BISECTPTR-39]:=(BISECTSTACK[BISECTPTR-40]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-19]:=(BISECTSTACK[BISECTPTR-18]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-38]:=(BISECTSTACK[BISECTPTR-39]+BISECTSTACK[
BISECTPTR-19])DIV 2;
BISECTSTACK[BISECTPTR-20]:=BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-40]<0 THEN IF BISECTSTACK[BISECTPTR-38]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-39]<0 THEN BISECTSTACK[BISECTPTR-37]:=
BISECTSTACK[BISECTPTR-40]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-38]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-39]>0 THEN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40
]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[
BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;END;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
UV:=BISECTPTR-20;XY:=BISECTPTR-20;DELX:=DELX+DELX;DELY:=DELY+DELY{:513};
GOTO 22;END;{514:}45:IF ODD(CURTT)THEN IF ODD(CURT)THEN{515:}
BEGIN CURT:=(CURT)DIV 2;CURTT:=(CURTT)DIV 2;IF CURT=0 THEN GOTO 10;
BISECTPTR:=BISECTPTR-44;DELX:=BISECTSTACK[BISECTPTR];
DELY:=BISECTSTACK[BISECTPTR+1];UV:=BISECTSTACK[BISECTPTR+2];
XY:=BISECTSTACK[BISECTPTR+3];GOTO 45;END{:515}ELSE BEGIN CURT:=CURT+1;
DELX:=DELX+BISECTSTACK[UV-5]+BISECTSTACK[UV-4]+BISECTSTACK[UV-3];
DELY:=DELY+BISECTSTACK[UV-10]+BISECTSTACK[UV-9]+BISECTSTACK[UV-8];
UV:=UV+20;CURTT:=CURTT-1;XY:=XY-20;
DELX:=DELX+BISECTSTACK[XY-15]+BISECTSTACK[XY-14]+BISECTSTACK[XY-13];
DELY:=DELY+BISECTSTACK[XY-20]+BISECTSTACK[XY-19]+BISECTSTACK[XY-18];
END ELSE BEGIN CURTT:=CURTT+1;
DELX:=DELX-BISECTSTACK[XY-15]-BISECTSTACK[XY-14]-BISECTSTACK[XY-13];
DELY:=DELY-BISECTSTACK[XY-20]-BISECTSTACK[XY-19]-BISECTSTACK[XY-18];
XY:=XY+20;END{:514};END;10:END;{:511}{516:}
PROCEDURE PATHINTERSEC(H,HH:HALFWORD);LABEL 10;VAR P,PP:HALFWORD;
N,NN:INTEGER;BEGIN{517:}
IF MEM[H].HH.B1=0 THEN BEGIN MEM[H+5].INT:=MEM[H+1].INT;
MEM[H+3].INT:=MEM[H+1].INT;MEM[H+6].INT:=MEM[H+2].INT;
MEM[H+4].INT:=MEM[H+2].INT;MEM[H].HH.B1:=1;END;
IF MEM[HH].HH.B1=0 THEN BEGIN MEM[HH+5].INT:=MEM[HH+1].INT;
MEM[HH+3].INT:=MEM[HH+1].INT;MEM[HH+6].INT:=MEM[HH+2].INT;
MEM[HH+4].INT:=MEM[HH+2].INT;MEM[HH].HH.B1:=1;END;{:517};N:=-65536;P:=H;
REPEAT IF MEM[P].HH.B1<>0 THEN BEGIN NN:=-65536;PP:=HH;
REPEAT IF MEM[PP].HH.B1<>0 THEN BEGIN CUBICINTERSE(P,PP);
IF CURT>0 THEN BEGIN CURT:=CURT+N;CURTT:=CURTT+NN;GOTO 10;END;END;
NN:=NN+65536;PP:=MEM[PP].HH.RH;UNTIL PP=HH;END;N:=N+65536;
P:=MEM[P].HH.RH;UNTIL P=H;CURT:=-65536;CURTT:=-65536;10:END;{:516}{518:}
FUNCTION INITSC:BOOLEAN;EXTERN;PROCEDURE UPDSCR;EXTERN;{:518}{521:}
PROCEDURE BLANKR(LEFTCOL,RIGHTCOL:SCREENCOL;TOPROW,BOTROW:SCREENROW);
EXTERN;{:521}{522:}PROCEDURE PAINTR(R:SCREENROW;B:PIXELCOLOR;
VAR A:TRANSSPEC;N:SCREENCOL);EXTERN;{:522}{528:}
PROCEDURE OPENAWINDOW(K:WINDOWNUMBER;R0,C0,R1,C1:SCALED;X,Y:SCALED);
VAR M,N:INTEGER;BEGIN{529:}IF R0<0 THEN R0:=0 ELSE R0:=ROUNDUNSCALE(R0);
R1:=ROUNDUNSCALE(R1);IF R1>SCREENDEPTH THEN R1:=SCREENDEPTH;
IF R1<R0 THEN IF R0>SCREENDEPTH THEN R0:=R1 ELSE R1:=R0;
IF C0<0 THEN C0:=0 ELSE C0:=ROUNDUNSCALE(C0);C1:=ROUNDUNSCALE(C1);
IF C1>SCREENWIDTH THEN C1:=SCREENWIDTH;
IF C1<C0 THEN IF C0>SCREENWIDTH THEN C0:=C1 ELSE C1:=C0{:529};
WINDOWOPEN[K]:=TRUE;WINDOWTIME[K]:=WINDOWTIME[K]+1;LEFTCOL[K]:=C0;
RIGHTCOL[K]:=C1;TOPROW[K]:=R0;BOTROW[K]:=R1;{530:}M:=ROUNDUNSCALE(X);
N:=ROUNDUNSCALE(Y)-1;MWINDOW[K]:=C0-M;NWINDOW[K]:=R0+N{:530};
BEGIN IF NOT SCREENSTARTE THEN BEGIN SCREENOK:=INITSC;
SCREENSTARTE:=TRUE;END;END;IF SCREENOK THEN BEGIN BLANKR(C0,C1,R0,R1);
UPDSCR;END;END;{:528}{531:}PROCEDURE DISPEDGES(K:WINDOWNUMBER);
LABEL 30,40;VAR P,Q:HALFWORD;ALREADYTHERE:BOOLEAN;R:INTEGER;{534:}
N:SCREENCOL;W,WW:INTEGER;B:PIXELCOLOR;M,MM:INTEGER;D:INTEGER;
MADJUSTMENT:INTEGER;RIGHTEDGE:INTEGER;MINCOL:SCREENCOL;{:534}
BEGIN IF SCREENOK THEN IF LEFTCOL[K]<RIGHTCOL[K]THEN IF TOPROW[K]<BOTROW
[K]THEN BEGIN ALREADYTHERE:=FALSE;
IF MEM[CUREDGES+3].HH.RH=K THEN IF MEM[CUREDGES+4].INT=WINDOWTIME[K]THEN
ALREADYTHERE:=TRUE;
IF NOT ALREADYTHERE THEN BLANKR(LEFTCOL[K],RIGHTCOL[K],TOPROW[K],BOTROW[
K]);{535:}MADJUSTMENT:=MWINDOW[K]-MEM[CUREDGES+3].HH.LH;
RIGHTEDGE:=8*(RIGHTCOL[K]-MADJUSTMENT);MINCOL:=LEFTCOL[K]{:535};
P:=MEM[CUREDGES].HH.RH;R:=NWINDOW[K]-(MEM[CUREDGES+1].HH.LH-4096);
WHILE(P<>CUREDGES)AND(R>=TOPROW[K])DO BEGIN IF R<BOTROW[K]THEN{532:}
BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P)ELSE IF MEM[P+1].HH.LH=1 THEN
IF ALREADYTHERE THEN GOTO 30;MEM[P+1].HH.LH:=1;{536:}N:=0;WW:=0;M:=-1;
W:=0;Q:=MEM[P+1].HH.RH;ROWTRANSITIO[0]:=MINCOL;
WHILE TRUE DO BEGIN IF Q=26000 THEN D:=RIGHTEDGE ELSE D:=MEM[Q].HH.LH;
MM:=(D DIV 8)+MADJUSTMENT;IF MM<>M THEN BEGIN{537:}
IF W<=0 THEN BEGIN IF WW>0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN IF
ALREADYTHERE THEN BEGIN B:=0;N:=N+1;END ELSE B:=1 ELSE N:=N+1;
ROWTRANSITIO[N]:=M;END;
END ELSE IF WW<=0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN B:=1;N:=N+1;
ROWTRANSITIO[N]:=M;END{:537};M:=MM;W:=WW;END;
IF D>=RIGHTEDGE THEN GOTO 40;WW:=WW+(D MOD 8)-4;Q:=MEM[Q].HH.RH;END;
40:{538:}
IF ALREADYTHERE OR(WW>0)THEN BEGIN IF N=0 THEN IF WW>0 THEN B:=1 ELSE B
:=0;N:=N+1;ROWTRANSITIO[N]:=RIGHTCOL[K];
END ELSE IF N=0 THEN GOTO 30{:538};{:536};PAINTR(R,B,ROWTRANSITIO,N);
30:END{:532};P:=MEM[P].HH.RH;R:=R-1;END;UPDSCR;
WINDOWTIME[K]:=WINDOWTIME[K]+1;MEM[CUREDGES+3].HH.RH:=K;
MEM[CUREDGES+4].INT:=WINDOWTIME[K];END;END;{:531}{544:}
FUNCTION MAXCOEF(P:HALFWORD):FRACTION;VAR X:FRACTION;BEGIN X:=0;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF ABS(MEM[P+1].INT)>X THEN X:=ABS(MEM[P
+1].INT);P:=MEM[P].HH.RH;END;MAXCOEF:=X;END;{:544}{547:}
FUNCTION PPLUSFQ(P:HALFWORD;F:INTEGER;Q:HALFWORD;
T:SMALLNUMBER):HALFWORD;LABEL 30;VAR PP,QQ:HALFWORD;R,S:HALFWORD;
THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=17 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=26001;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{548:}
BEGIN V:=MEM[P+1].INT+TAKEFRACTION(F,MEM[Q+1].INT);MEM[P+1].INT:=V;S:=P;
P:=MEM[P].HH.RH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;PP:=MEM[P].HH.LH;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:548}ELSE IF PP<QQ THEN{549:}
BEGIN V:=TAKEFRACTION(F,MEM[Q+1].INT);
IF ABS(V)>(THRESHOLD)DIV 2 THEN BEGIN S:=GETNODE(2);MEM[S].HH.LH:=QQ;
MEM[S+1].INT:=V;
IF ABS(V)>=626349397 THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;
FIXNEEDED:=TRUE;END;MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:549}ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:IF T=17 THEN MEM[P+1].INT:=MEM[P+1].INT+TAKEFRACTION(MEM[Q+1].INT,F)
ELSE MEM[P+1].INT:=MEM[P+1].INT+TAKESCALED(MEM[Q+1].INT,F);
MEM[R].HH.RH:=P;DEPFINAL:=P;PPLUSFQ:=MEM[26001].HH.RH;END;{:547}{550:}
FUNCTION PPLUSQ(P:HALFWORD;Q:HALFWORD;T:SMALLNUMBER):HALFWORD;LABEL 30;
VAR PP,QQ:HALFWORD;R,S:HALFWORD;THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=17 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=26001;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{551:}
BEGIN V:=MEM[P+1].INT+MEM[Q+1].INT;MEM[P+1].INT:=V;S:=P;P:=MEM[P].HH.RH;
PP:=MEM[P].HH.LH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;END{:551}
ELSE IF PP<QQ THEN BEGIN S:=GETNODE(2);MEM[S].HH.LH:=QQ;
MEM[S+1].INT:=MEM[Q+1].INT;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;
MEM[R].HH.RH:=S;R:=S;END ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:MEM[P+1].INT:=MEM[P+1].INT+MEM[Q+1].INT;MEM[R].HH.RH:=P;DEPFINAL:=P;
PPLUSQ:=MEM[26001].HH.RH;END;{:550}{552:}FUNCTION PTIMESV(P:HALFWORD;
V:INTEGER;T0,T1:SMALLNUMBER;VISSCALED:BOOLEAN):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=NOT VISSCALED;
IF T1=17 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=26001;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN W:=TAKEFRACTION(V,MEM
[P+1].INT)ELSE W:=TAKESCALED(V,MEM[P+1].INT);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM[P+1].
INT:=TAKEFRACTION(MEM[P+1].INT,V);PTIMESV:=MEM[26001].HH.RH;END;{:552}
{553:}FUNCTION POVERV(P:HALFWORD;V:SCALED;T0,T1:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=FALSE;
IF T1=17 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=26001;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN IF ABS(V)<524288 THEN
W:=MAKESCALED(MEM[P+1].INT,V*4096)ELSE W:=MAKESCALED(ROUNDFRACTIO(MEM[P
+1].INT),V)ELSE W:=MAKESCALED(MEM[P+1].INT,V);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);POVERV:=MEM[26001].HH.RH;END;
{:553}{554:}FUNCTION PWITHXBECOMI(P,X,Q:HALFWORD;
T:SMALLNUMBER):HALFWORD;VAR R,S:HALFWORD;V:INTEGER;BEGIN S:=P;R:=26001;
WHILE MEM[S].HH.LH>X DO BEGIN R:=S;S:=MEM[S].HH.RH;END;
IF MEM[S].HH.LH<>X THEN PWITHXBECOMI:=P ELSE BEGIN MEM[26001].HH.RH:=P;
MEM[R].HH.RH:=MEM[S].HH.RH;V:=MEM[S+1].INT;FREENODE(S,2);
PWITHXBECOMI:=PPLUSFQ(MEM[26001].HH.RH,V,Q,T);END;END;{:554}{555:}
PROCEDURE FIXDEPENDENC;LABEL 30;VAR P,R,S:HALFWORD;X:HALFWORD;
BEGIN R:=MEM[13].HH.RH;S:=0;WHILE R<>13 DO BEGIN R:=MEM[R+1].HH.RH;
WHILE TRUE DO BEGIN X:=MEM[R].HH.LH;IF X=0 THEN GOTO 30;
IF MEM[X].HH.B0<=1 THEN BEGIN IF MEM[X].HH.B0<1 THEN BEGIN P:=GETAVAIL;
MEM[P].HH.RH:=S;S:=P;MEM[S].HH.LH:=X;MEM[X].HH.B0:=1;END;
MEM[R+1].INT:=MEM[R+1].INT DIV 4;END;R:=MEM[R].HH.RH;END;
30:R:=MEM[R].HH.RH;END;WHILE S<>0 DO BEGIN P:=MEM[S].HH.RH;
X:=MEM[S].HH.LH;BEGIN MEM[S].HH.RH:=AVAIL;AVAIL:=S;DYNUSED:=DYNUSED-1;
END;S:=P;MEM[X].HH.B0:=20;MEM[X+1].INT:=MEM[X+1].INT+2;END;END;{:555}
{556:}PROCEDURE NEWDEP(Q,P:HALFWORD);VAR R:HALFWORD;
BEGIN MEM[Q+1].HH.RH:=P;MEM[Q+1].HH.LH:=13;R:=MEM[13].HH.RH;
MEM[DEPFINAL].HH.RH:=R;MEM[R+1].HH.LH:=DEPFINAL;MEM[13].HH.RH:=Q;END;
{:556}{557:}PROCEDURE LINEAREQ(P:HALFWORD;T:SMALLNUMBER);
VAR Q,R,S:HALFWORD;X:HALFWORD;N:INTEGER;V:INTEGER;PREVR:HALFWORD;
FINALNODE:HALFWORD;W:INTEGER;BEGIN{558:}Q:=P;R:=MEM[P].HH.RH;
V:=MEM[Q+1].INT;
WHILE MEM[R].HH.LH<>0 DO BEGIN IF ABS(MEM[R+1].INT)>ABS(V)THEN BEGIN Q:=
R;V:=MEM[R+1].INT;END;R:=MEM[R].HH.RH;END{:558};X:=MEM[Q].HH.LH;
N:=MEM[X+1].INT;{559:}S:=26001;MEM[S].HH.RH:=P;R:=P;
REPEAT IF R=Q THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN W:=MAKEFRACTION(MEM[R+1].INT,V);
IF ABS(W)<=1342 THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN MEM[R+1].INT:=-W;S:=R;END;END;R:=MEM[S].HH.RH;
UNTIL MEM[R].HH.LH=0;
IF T=18 THEN MEM[R+1].INT:=-MAKESCALED(MEM[R+1].INT,V)ELSE IF V<>
-268435456 THEN MEM[R+1].INT:=-MAKEFRACTION(MEM[R+1].INT,V);
FINALNODE:=R;P:=MEM[26001].HH.RH{:559};IF INTERNAL[2]>0 THEN{560:}
BEGIN PRINTNL(436);PRINTVARIABL(X);W:=N;WHILE W>0 DO BEGIN PRINT(435);
W:=W-2;END;PRINTCHAR(61);PRINTDEPENDE(P,17);END{:560};{561:}PREVR:=13;
R:=MEM[13].HH.RH;WHILE R<>13 DO BEGIN S:=MEM[R+1].HH.RH;
Q:=PWITHXBECOMI(S,X,P,MEM[R].HH.B0);IF MEM[Q].HH.LH=0 THEN{562:}
BEGIN MEM[R].HH.B0:=16;MEM[R+1].INT:=MEM[Q+1].INT;
IF ABS(MEM[R+1].INT)>=268435456 THEN ARITHERROR:=TRUE;
IF INTERNAL[2]>0 THEN IF MEM[R].HH.B1<>11 THEN BEGIN PRINTNL(437);
PRINTVARIABL(R);PRINTCHAR(61);PRINTSCALED(MEM[R+1].INT);END;
R:=MEM[Q].HH.RH;MEM[R+1].HH.LH:=PREVR;MEM[PREVR].HH.RH:=R;FREENODE(Q,2);
END{:562}ELSE BEGIN MEM[R+1].HH.RH:=Q;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.LH=0;PREVR:=Q;R:=MEM[Q].HH.RH;END;END{:561};{563:}
IF N>0 THEN{564:}BEGIN S:=26001;MEM[26001].HH.RH:=P;R:=P;
REPEAT IF N>30 THEN W:=0 ELSE W:=MEM[R+1].INT DIV TWOTOTHE[N];
IF(ABS(W)<=1342)AND(MEM[R].HH.LH<>0)THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.
RH;FREENODE(R,2);END ELSE BEGIN MEM[R+1].INT:=W;S:=R;END;
R:=MEM[S].HH.RH;UNTIL MEM[S].HH.LH=0;P:=MEM[26001].HH.RH;END{:564};
IF MEM[P].HH.LH=0 THEN BEGIN MEM[X].HH.B0:=16;
MEM[X+1].INT:=MEM[P+1].INT;
IF ABS(MEM[X+1].INT)>=268435456 THEN ARITHERROR:=TRUE;FREENODE(P,2);
END ELSE BEGIN MEM[X].HH.B0:=17;DEPFINAL:=FINALNODE;NEWDEP(X,P);
END{:563};IF FIXNEEDED THEN FIXDEPENDENC;END;{:557}{566:}
FUNCTION NEWRINGENTRY(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q].HH.B1:=11;MEM[Q].HH.B0:=MEM[P].HH.B0;
IF MEM[P+1].INT=0 THEN MEM[Q+1].INT:=P ELSE MEM[Q+1].INT:=MEM[P+1].INT;
MEM[P+1].INT:=Q;NEWRINGENTRY:=Q;END;{:566}{569:}
PROCEDURE NONLINEAREQ(V:INTEGER;P:HALFWORD;FLUSHP:BOOLEAN);
VAR T:SMALLNUMBER;Q,R:HALFWORD;BEGIN T:=MEM[P].HH.B0-1;Q:=MEM[P+1].INT;
IF FLUSHP THEN MEM[P].HH.B0:=1 ELSE P:=Q;REPEAT R:=MEM[Q+1].INT;
MEM[Q].HH.B0:=T;CASE T OF 2:MEM[Q+1].INT:=V;4:BEGIN MEM[Q+1].INT:=V;
BEGIN IF STRREF[V]<127 THEN STRREF[V]:=STRREF[V]+1;END;END;
6:BEGIN MEM[Q+1].INT:=V;MEM[V].HH.LH:=MEM[V].HH.LH+1;END;
9:MEM[Q+1].INT:=COPYEDGES(V);11:MEM[Q+1].INT:=COPYPATH(V);END;Q:=R;
UNTIL Q=P;END;{:569}{570:}PROCEDURE RINGMERGE(P,Q:HALFWORD);LABEL 10;
VAR R:HALFWORD;BEGIN R:=MEM[P+1].INT;
WHILE R<>P DO BEGIN IF R=Q THEN BEGIN{571:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(438);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=439;HELPLINE[0]:=440;END;ERROR;
END{:571};GOTO 10;END;R:=MEM[R+1].INT;END;R:=MEM[P+1].INT;
MEM[P+1].INT:=MEM[Q+1].INT;MEM[Q+1].INT:=R;10:END;{:570}{575:}
PROCEDURE SHOWCMDMOD(C,M:INTEGER);BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTCMDMOD(C,M);PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END;{:575}{584:}
PROCEDURE SHOWCONTEXT;LABEL 30;VAR OLDSETTING:0..5;{589:}I:0..BUFSIZE;
J:0..BUFSIZE;L:0..HALFERRORLIN;M:INTEGER;N:0..ERRORLINE;P:INTEGER;
Q:INTEGER;{:589}BEGIN FILEPTR:=INPUTPTR;INPUTSTACK[FILEPTR]:=CURINPUT;
WHILE TRUE DO BEGIN CURINPUT:=INPUTSTACK[FILEPTR];{585:}
IF(FILEPTR=INPUTPTR)OR(CURINPUT.INDEXFIELD<=6)OR(CURINPUT.INDEXFIELD<>10
)OR(CURINPUT.LOCFIELD<>0)THEN BEGIN TALLY:=0;OLDSETTING:=SELECTOR;
IF(CURINPUT.INDEXFIELD<=6)THEN BEGIN{586:}
IF CURINPUT.NAMEFIELD<=1 THEN IF(CURINPUT.NAMEFIELD=0)AND(FILEPTR=0)THEN
PRINTNL(448)ELSE PRINTNL(449)ELSE BEGIN IF PAGE>1 THEN BEGIN PRINTNL(450
);PRINTINT(PAGE);PRINT(451);END ELSE PRINTNL(452);PRINTINT(LINE);END;
PRINTCHAR(32){:586};{592:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.LIMITFIELD>0 THEN FOR I:=CURINPUT.STARTFIELD TO CURINPUT.
LIMITFIELD-1 DO BEGIN IF I=CURINPUT.LOCFIELD THEN BEGIN FIRSTCOUNT:=
TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;PRINT(BUFFER[I]);
END{:592};END ELSE BEGIN{587:}
CASE CURINPUT.INDEXFIELD OF 7:PRINTNL(453);8:PRINTNL(454);
10:IF CURINPUT.LOCFIELD=0 THEN PRINTNL(455)ELSE PRINTNL(456);
11:PRINTNL(457);12:BEGIN PRINTLN;
IF CURINPUT.NAMEFIELD<>0 THEN PRINT(HASH[CURINPUT.NAMEFIELD].RH)ELSE{588
:}BEGIN P:=PARAMSTACK[CURINPUT.LIMITFIELD];
IF P=0 THEN SHOWTOKENLIS(PARAMSTACK[CURINPUT.LIMITFIELD+1],0,1000)ELSE
BEGIN Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=PARAMSTACK[CURINPUT.LIMITFIELD+1];SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END{:588};PRINT(358);END;9:PRINTNL(458);
OTHERS:PRINTNL(63)END{:587};{593:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.INDEXFIELD<>12 THEN SHOWTOKENLIS(CURINPUT.STARTFIELD,
CURINPUT.LOCFIELD,100000)ELSE SHOWMACRO(CURINPUT.STARTFIELD,CURINPUT.
LOCFIELD,100000){:593};END;SELECTOR:=OLDSETTING;{591:}
IF TRICKCOUNT=1000000 THEN BEGIN FIRSTCOUNT:=TALLY;
TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;
IF TALLY<TRICKCOUNT THEN M:=TALLY-FIRSTCOUNT ELSE M:=TRICKCOUNT-
FIRSTCOUNT;IF L+FIRSTCOUNT<=HALFERRORLIN THEN BEGIN P:=0;
N:=L+FIRSTCOUNT;END ELSE BEGIN PRINT(148);
P:=L+FIRSTCOUNT-HALFERRORLIN+3;N:=HALFERRORLIN;END;
FOR Q:=P TO FIRSTCOUNT-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
PRINTLN;FOR Q:=1 TO N DO PRINTCHAR(32);
IF M+N<=ERRORLINE THEN P:=FIRSTCOUNT+M ELSE P:=FIRSTCOUNT+(ERRORLINE-N-3
);FOR Q:=FIRSTCOUNT TO P-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
IF M+N>ERRORLINE THEN PRINT(148){:591};END{:585};
IF(CURINPUT.INDEXFIELD<=6)THEN IF(CURINPUT.NAMEFIELD>0)OR(FILEPTR=0)THEN
GOTO 30;FILEPTR:=FILEPTR-1;END;30:CURINPUT:=INPUTSTACK[INPUTPTR];END;
{:584}{597:}PROCEDURE BEGINTOKENLI(P:HALFWORD;T:QUARTERWORD);
BEGIN BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(459,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.STARTFIELD:=P;CURINPUT.INDEXFIELD:=T;
CURINPUT.LIMITFIELD:=PARAMPTR;CURINPUT.LOCFIELD:=P;END;{:597}{598:}
PROCEDURE ENDTOKENLIST;LABEL 30;VAR P:HALFWORD;
BEGIN IF CURINPUT.INDEXFIELD>=10 THEN IF CURINPUT.INDEXFIELD<=11 THEN
BEGIN FLUSHTOKENLI(CURINPUT.STARTFIELD);GOTO 30;
END ELSE DELETEMACREF(CURINPUT.STARTFIELD);
WHILE PARAMPTR>CURINPUT.LIMITFIELD DO BEGIN PARAMPTR:=PARAMPTR-1;
P:=PARAMSTACK[PARAMPTR];
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);END;30:BEGIN INPUTPTR:=INPUTPTR-1;
CURINPUT:=INPUTSTACK[INPUTPTR];END;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;END;{:598}{599:}
FUNCTION CURTOK:HALFWORD;VAR P:HALFWORD;
BEGIN IF CURSYM=0 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=CURMOD;
MEM[P].HH.LH:=CURCMD;END ELSE BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
END;CURTOK:=P;END;{:599}{600:}PROCEDURE BACKINPUT;VAR P:HALFWORD;
S:0..150;BEGIN P:=CURTOK;
IF CURSYM<2244 THEN BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.
LOCFIELD=0)DO ENDTOKENLIST;BEGINTOKENLI(P,10);
END ELSE BEGIN S:=CURINPUT.LIMITFIELD;BEGINTOKENLI(P,10);
CURINPUT.LIMITFIELD:=S;END;END;{:600}{601:}PROCEDURE BACKERROR;
BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;OKTOINTERRUP:=TRUE;ERROR;END;
PROCEDURE INSERROR;BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;
CURINPUT.INDEXFIELD:=11;OKTOINTERRUP:=TRUE;ERROR;END;{:601}{602:}
PROCEDURE BEGINFILEREA;BEGIN IF INOPEN=6 THEN OVERFLOW(460,6);
IF FIRST=BUFSIZE THEN OVERFLOW(128,BUFSIZE);INOPEN:=INOPEN+1;
BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(459,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.INDEXFIELD:=INOPEN;LINESTACK[CURINPUT.INDEXFIELD]:=LINE;
CURINPUT.STARTFIELD:=FIRST;PAGESTACK[CURINPUT.INDEXFIELD]:=PAGE;
CURINPUT.NAMEFIELD:=0;END;{:602}{603:}PROCEDURE ENDFILEREADI;
BEGIN FIRST:=CURINPUT.STARTFIELD;PAGE:=PAGESTACK[CURINPUT.INDEXFIELD];
LINE:=LINESTACK[CURINPUT.INDEXFIELD];
IF CURINPUT.INDEXFIELD<>INOPEN THEN CONFUSION(461);
IF CURINPUT.NAMEFIELD>1 THEN ACLOSE(INPUTFILE[CURINPUT.INDEXFIELD]);
BEGIN INPUTPTR:=INPUTPTR-1;CURINPUT:=INPUTSTACK[INPUTPTR];END;
INOPEN:=INOPEN-1;END;{:603}{604:}PROCEDURE CLEARFORERRO;
BEGIN WHILE(CURINPUT.INDEXFIELD<=6)AND(CURINPUT.NAMEFIELD=0)AND(INPUTPTR
>0)AND(CURINPUT.LOCFIELD=CURINPUT.LIMITFIELD)DO ENDFILEREADI;PRINTLN;
BREAKIN(TTY,TRUE);END;{:604}{609:}FUNCTION CHECKOUTERVA:BOOLEAN;
VAR P:HALFWORD;Q:HALFWORD;
BEGIN IF SCANNERSTATU=0 THEN CHECKOUTERVA:=TRUE ELSE BEGIN DELETIONSALL
:=FALSE;{610:}IF CURSYM<>0 THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
BEGINTOKENLI(P,10);END{:610};IF SCANNERSTATU>1 THEN{611:}BEGIN RUNAWAY;
IF CURSYM=0 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(467);END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(468);END;END;PRINT(469);BEGIN HELPPTR:=4;
HELPLINE[3]:=470;HELPLINE[2]:=471;HELPLINE[1]:=472;HELPLINE[0]:=473;END;
CASE SCANNERSTATU OF{612:}2:BEGIN PRINT(474);HELPLINE[3]:=475;
CURSYM:=2235;END;3:BEGIN PRINT(476);HELPLINE[3]:=477;CURSYM:=2231;
EQTB[2231].RH:=WARNINGINFO;END;4,5:BEGIN PRINT(478);
IF SCANNERSTATU=5 THEN PRINT(HASH[WARNINGINFO].RH)ELSE PRINTVARIABL(
WARNINGINFO);CURSYM:=2237;END;6:BEGIN PRINT(479);
PRINT(HASH[WARNINGINFO].RH);PRINT(480);HELPLINE[3]:=481;CURSYM:=2236;
END;{:612}END;INSERROR;END{:611}
ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(462);END;PRINTINT(WARNINGINFO);BEGIN HELPPTR:=3;HELPLINE[2]:=463;
HELPLINE[1]:=464;HELPLINE[0]:=465;END;IF CURSYM=0 THEN HELPLINE[2]:=466;
CURSYM:=2238;INSERROR;END;DELETIONSALL:=TRUE;CHECKOUTERVA:=FALSE;END;
END;{:609}{614:}PROCEDURE FIRMUPTHELIN;FORWARD;{:614}{615:}
PROCEDURE GETNEXT;LABEL 20,10,40,25,85,86,87,30;VAR K:0..BUFSIZE;
C:ASCIICODE;CLASS:ASCIICODE;N,F:INTEGER;BEGIN 20:CURSYM:=0;
IF(CURINPUT.INDEXFIELD<=6)THEN{617:}
BEGIN 25:C:=BUFFER[CURINPUT.LOCFIELD];
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CLASS:=CHARCLASS[C];
CASE CLASS OF 0:GOTO 85;
1:BEGIN CLASS:=CHARCLASS[BUFFER[CURINPUT.LOCFIELD]];
IF CLASS>1 THEN GOTO 25 ELSE IF CLASS<1 THEN BEGIN N:=0;GOTO 86;END;END;
2:GOTO 25;3:BEGIN{626:}IF CURINPUT.NAMEFIELD>1 THEN{628:}
BEGIN LINE:=LINE+1;FIRST:=CURINPUT.STARTFIELD;
IF NOT FORCEEOF THEN BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],
TRUE)THEN FIRMUPTHELIN ELSE FORCEEOF:=TRUE;END;
IF FORCEEOF THEN BEGIN PRINTCHAR(41);FORCEEOF:=FALSE;BREAK(TTY);
ENDFILEREADI;IF CHECKOUTERVA THEN GOTO 20 ELSE GOTO 20;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;END{:628}
ELSE BEGIN IF NOT(CURINPUT.NAMEFIELD=0)THEN BEGIN CURCMD:=56;CURMOD:=0;
GOTO 10;END;IF INPUTPTR>0 THEN BEGIN ENDFILEREADI;GOTO 20;END;
IF SELECTOR<2 THEN OPENLOGFILE;
IF INTERACTION>1 THEN BEGIN IF CURINPUT.LIMITFIELD=CURINPUT.STARTFIELD
THEN PRINTNL(493);PRINTLN;FIRST:=CURINPUT.STARTFIELD;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(42);TERMINPUT;END;
CURINPUT.LIMITFIELD:=LAST;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
END ELSE FATALERROR(494);END{:626};
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GOTO 25;END;4:{618:}
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=34 THEN CURMOD:=312 ELSE BEGIN K:=
CURINPUT.LOCFIELD;BUFFER[CURINPUT.LIMITFIELD+1]:=34;
REPEAT CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL BUFFER[CURINPUT.LOCFIELD]=34;
IF CURINPUT.LOCFIELD>CURINPUT.LIMITFIELD THEN{619:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(486);
END;BEGIN HELPPTR:=3;HELPLINE[2]:=487;HELPLINE[1]:=488;HELPLINE[0]:=489;
END;DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;GOTO 20;END{:619};
IF CURINPUT.LOCFIELD=K+1 THEN CURMOD:=BUFFER[K]ELSE BEGIN BEGIN IF
POOLPTR+CURINPUT.LOCFIELD-K>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);END;REPEAT BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;K:=K+1;UNTIL K=CURINPUT.LOCFIELD;
CURMOD:=MAKESTRING;END;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURCMD:=40;GOTO 10;END{:618};5,6,7,8:BEGIN K:=CURINPUT.LOCFIELD-1;
GOTO 40;END;OTHERS:END;K:=CURINPUT.LOCFIELD-1;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=CLASS DO CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;GOTO 40;85:{620:}N:=C-48;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=0 DO BEGIN IF N<4096 THEN N:=
10*N+BUFFER[CURINPUT.LOCFIELD]-48;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
IF BUFFER[CURINPUT.LOCFIELD]=46 THEN IF CHARCLASS[BUFFER[CURINPUT.
LOCFIELD+1]]=0 THEN GOTO 30;F:=0;GOTO 87;
30:CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1{:620};86:{621:}K:=0;
REPEAT IF K<17 THEN BEGIN DIG[K]:=BUFFER[CURINPUT.LOCFIELD]-48;K:=K+1;
END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]<>0;F:=ROUNDDECIMAL(K){:621};
87:{622:}
IF N<4096 THEN CURMOD:=N*65536+F ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(490);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=491;HELPLINE[0]:=492;END;DELETIONSALL:=FALSE;ERROR;
DELETIONSALL:=TRUE;CURMOD:=268435455;END;CURCMD:=41;GOTO 10{:622};
40:CURSYM:=IDLOOKUP(K,CURINPUT.LOCFIELD-K);END{:617}ELSE{623:}
IF CURINPUT.LOCFIELD>26000 THEN BEGIN CURSYM:=MEM[CURINPUT.LOCFIELD].HH.
LH;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
IF CURSYM>=2244 THEN IF CURSYM>=2544 THEN{624:}
BEGIN IF CURSYM>=2694 THEN CURSYM:=CURSYM-150;
BEGINTOKENLI(PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2544)],8);GOTO 20;
END{:624}ELSE BEGIN CURCMD:=38;
CURMOD:=PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2394)];GOTO 10;END;
END ELSE IF CURINPUT.LOCFIELD>0 THEN{625:}
BEGIN CURCMD:=MEM[CURINPUT.LOCFIELD].HH.LH;
CURMOD:=MEM[CURINPUT.LOCFIELD+1].INT;
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=
STRREF[CURMOD]+1;END;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
GOTO 10;END{:625}ELSE BEGIN ENDTOKENLIST;GOTO 20;END{:623};{616:}
CURCMD:=EQTB[CURSYM].LH;CURMOD:=EQTB[CURSYM].RH;
IF CURCMD>=82 THEN IF CHECKOUTERVA THEN CURCMD:=CURCMD-82 ELSE GOTO 20{:
616};10:END;{:615}{629:}PROCEDURE FIRMUPTHELIN;VAR K:0..BUFSIZE;
BEGIN CURINPUT.LIMITFIELD:=LAST;
IF(INTERNAL[26]>0)AND(INTERACTION>1)AND(BUFFER[CURINPUT.STARTFIELD]<>12)
THEN BEGIN BEGIN IF INSKP0 THEN END;PRINTLN;
IF CURINPUT.STARTFIELD=CURINPUT.LIMITFIELD THEN BEGIN BUFFER[CURINPUT.
STARTFIELD]:=32;CURINPUT.LIMITFIELD:=CURINPUT.LIMITFIELD+1;END;
SELECTOR:=SELECTOR-1;
FOR K:=CURINPUT.STARTFIELD TO CURINPUT.LIMITFIELD-1 DO BEGIN PRINTCHAR(
BUFFER[K]);PTWR1W(0,ORD(XCHR[BUFFER[K]]));END;PRINT(495);
FIRST:=CURINPUT.STARTFIELD;IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);
IF LAST>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINTCHAR(BUFFER[K]);
CURINPUT.LIMITFIELD:=LAST;PRINTLN;SELECTOR:=SELECTOR+1;END;END;{:629}
{632:}FUNCTION SCANTOKS(TERMINATOR:COMMANDCODE;
SUBSTLIST,TAILEND:HALFWORD;SUFFIXCOUNT:SMALLNUMBER):HALFWORD;
LABEL 30,40;VAR P:HALFWORD;Q:HALFWORD;BALANCE:INTEGER;
PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;BEGIN PARAMSETTING:=PARAMPTR;
EXPRARGRENUM:=FALSE;P:=26001;BALANCE:=1;MEM[26001].HH.RH:=0;
WHILE TRUE DO BEGIN GETNEXT;IF CURCMD=TERMINATOR THEN{636:}
IF CURMOD>0 THEN BALANCE:=BALANCE+1 ELSE BEGIN BALANCE:=BALANCE-1;
IF BALANCE=0 THEN GOTO 30;END{:636}ELSE IF CURCMD=61 THEN{639:}
BEGIN IF CURMOD=0 THEN GETNEXT ELSE IF CURMOD<=SUFFIXCOUNT THEN CURSYM:=
2543+CURMOD;END{:639}ELSE IF CURSYM>0 THEN IF CURSYM>=2244 THEN{634:}
IF TERMINATOR<>4 THEN BEGIN IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURCMD:=40
;CURMOD:=MEM[CURMOD+1].INT;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE BEGIN IF MEM[CURMOD].HH.B0=16 THEN CURMOD:=MEM[CURMOD+1].INT
ELSE BEGIN DISPERR(CURMOD,504);BEGIN HELPPTR:=2;HELPLINE[1]:=505;
HELPLINE[0]:=506;END;ERROR;CURMOD:=0;END;CURCMD:=41;END;CURSYM:=0;
END ELSE BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR;END{:634}ELSE{633:}
BEGIN Q:=SUBSTLIST;
WHILE Q<>0 DO BEGIN IF MEM[Q].HH.LH=CURSYM THEN BEGIN CURSYM:=MEM[Q+1].
INT;GOTO 40;END;Q:=MEM[Q].HH.RH;END;40:END{:633};MEM[P].HH.RH:=CURTOK;
P:=MEM[P].HH.RH;END;30:MEM[P].HH.RH:=TAILEND;FLUSHNODELIS(SUBSTLIST);
IF EXPRARGRENUM THEN{635:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(507)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=26003{:635};
SCANTOKS:=MEM[26001].HH.RH;END;{:632}{640:}PROCEDURE GETSYMBOL;LABEL 20;
BEGIN 20:GETNEXT;
IF(CURSYM=0)OR(CURSYM>2229)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(511);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=512;HELPLINE[1]:=513;HELPLINE[0]:=514;END;
IF CURSYM=0 THEN BACKINPUT;CURSYM:=2229;INSERROR;GOTO 20;END;END;{:640}
{641:}PROCEDURE GETCLEARSYMB;BEGIN GETSYMBOL;CLEARSYMBOL(CURSYM,FALSE);
END;{:641}{642:}PROCEDURE CHECKEQUALS;
BEGIN IF CURCMD<>50 THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=5;
HELPLINE[4]:=515;HELPLINE[3]:=516;HELPLINE[2]:=517;HELPLINE[1]:=518;
HELPLINE[0]:=519;END;BACKERROR;END;END;{:642}{643:}PROCEDURE MAKEOPDEF;
VAR M:COMMANDCODE;P,Q,R:HALFWORD;BEGIN M:=CURMOD;GETSYMBOL;
P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=2394;GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETSYMBOL;Q:=GETNODE(2);MEM[Q].HH.LH:=CURSYM;
MEM[Q+1].INT:=2395;MEM[P].HH.RH:=Q;GETNEXT;CHECKEQUALS;SCANNERSTATU:=5;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[R].HH.LH:=0;
MEM[R].HH.RH:=SCANTOKS(14,P,0,0);SCANNERSTATU:=0;
EQTB[WARNINGINFO].LH:=M;EQTB[WARNINGINFO].RH:=Q;GETNEXT;END;{:643}{646:}
{964:}PROCEDURE CHECKDELIMIT(LDELIM,RDELIM:HALFWORD);LABEL 10;
BEGIN IF CURCMD=62 THEN IF CURMOD=LDELIM THEN GOTO 10;
IF CURSYM<>RDELIM THEN BEGIN MISSINGERR(HASH[RDELIM].RH);
BEGIN HELPPTR:=2;HELPLINE[1]:=767;HELPLINE[0]:=768;END;BACKERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(769);END;PRINT(HASH[RDELIM].RH);PRINT(770);BEGIN HELPPTR:=3;
HELPLINE[2]:=771;HELPLINE[1]:=772;HELPLINE[0]:=773;END;ERROR;END;10:END;
{:964}{944:}FUNCTION SCANDECLARED:HALFWORD;LABEL 30;VAR X:HALFWORD;
H,T:HALFWORD;L:HALFWORD;BEGIN GETSYMBOL;X:=CURSYM;
IF CURCMD<>39 THEN CLEARSYMBOL(X,FALSE);IF EQTB[X].RH=0 THEN NEWROOT(X);
H:=GETAVAIL;MEM[H].HH.LH:=X;T:=H;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM=0 THEN GOTO 30;IF CURCMD<>39 THEN IF CURCMD=52 THEN{945:}
BEGIN L:=CURSYM;GETNEXT;IF CURCMD<>63 THEN BEGIN BACKINPUT;CURSYM:=L;
CURCMD:=52;GOTO 30;END ELSE CURSYM:=0;END{:945}ELSE GOTO 30;
MEM[T].HH.RH:=GETAVAIL;T:=MEM[T].HH.RH;MEM[T].HH.LH:=CURSYM;END;
30:SCANDECLARED:=H;END;{:944}PROCEDURE SCANDEF;VAR M:1..2;N:0..3;
K:0..150;C:0..5;R:HALFWORD;Q:HALFWORD;P:HALFWORD;BASE:HALFWORD;
LDELIM,RDELIM:HALFWORD;BEGIN M:=CURMOD;C:=0;MEM[26001].HH.RH:=0;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=0;{648:}IF M=1 THEN BEGIN GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETNEXT;SCANNERSTATU:=5;N:=0;
EQTB[WARNINGINFO].LH:=8;EQTB[WARNINGINFO].RH:=Q;
END ELSE BEGIN P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,TRUE);
WARNINGINFO:=FINDVARIABLE(P);FLUSHLIST(P);IF WARNINGINFO=0 THEN{649:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(526);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=527;HELPLINE[0]:=528;END;ERROR;
WARNINGINFO:=25;END{:649};SCANNERSTATU:=4;N:=2;
IF CURCMD=61 THEN IF CURMOD=3 THEN BEGIN N:=3;GETNEXT;END;
MEM[WARNINGINFO].HH.B0:=21+N;MEM[WARNINGINFO+1].INT:=Q;END{:648};K:=N;
IF CURCMD=30 THEN{651:}REPEAT LDELIM:=CURSYM;RDELIM:=CURMOD;GETNEXT;
IF(CURCMD=57)AND(CURMOD>=2394)THEN BASE:=CURMOD ELSE BEGIN BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(529);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=530;END;BACKERROR;BASE:=2394;END;{652:}
REPEAT MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=BASE+K;
GETSYMBOL;P:=GETNODE(2);MEM[P+1].INT:=BASE+K;MEM[P].HH.LH:=CURSYM;
IF K=150 THEN OVERFLOW(531,150);K:=K+1;MEM[P].HH.RH:=R;R:=P;GETNEXT;
UNTIL CURCMD<>78{:652};CHECKDELIMIT(LDELIM,RDELIM);GETNEXT;
UNTIL CURCMD<>30{:651}ELSE IF CURCMD=57 THEN{653:}
IF CURMOD<=2394 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=2394+N;
IF CURMOD<2394 THEN C:=CURMOD ELSE C:=4;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;IF C=4 THEN IF CURCMD=67 THEN BEGIN C:=5;
P:=GETNODE(2);MEM[P+1].INT:=2395+N;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;END;END{:653};CHECKEQUALS;P:=GETAVAIL;
MEM[P].HH.LH:=C;MEM[Q].HH.RH:=P;{647:}
IF M=1 THEN MEM[P].HH.RH:=SCANTOKS(14,R,0,N)ELSE BEGIN Q:=GETAVAIL;
MEM[Q].HH.LH:=2240;MEM[P].HH.RH:=Q;P:=GETAVAIL;MEM[P].HH.LH:=2241;
MEM[Q].HH.RH:=SCANTOKS(14,R,P,N);END{:647};SCANNERSTATU:=0;GETNEXT;END;
{:646}{654:}PROCEDURE READTOKS;VAR M:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN GETCLEARSYMB;M:=CURSYM;IF INTERACTION<=1 THEN FATALERROR(532);
BEGINFILEREA;CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;
PRINT(312);TERMINPUT;END;CURINPUT.LIMITFIELD:=LAST;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;P:=GETAVAIL;MEM[P].HH.LH:=0;
Q:=GETAVAIL;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=0;
MEM[Q].HH.RH:=SCANTOKS(56,0,0,0);EQTB[M].LH:=8;EQTB[M].RH:=P;
ENDFILEREADI;GETNEXT;END;{:654}{655:}PROCEDURE SCANPRIMARY;FORWARD;
PROCEDURE SCANSECONDAR;FORWARD;PROCEDURE SCANTERTIARY;FORWARD;
PROCEDURE SCANEXPRESSI;FORWARD;PROCEDURE SCANSUFFIX;FORWARD;{666:}{668:}
PROCEDURE PRINTMACRONA(A,N:HALFWORD);VAR P,Q:HALFWORD;
BEGIN IF N<>0 THEN PRINT(HASH[N].RH)ELSE BEGIN P:=MEM[A].HH.LH;
IF P=0 THEN PRINT(HASH[MEM[MEM[MEM[A].HH.RH].HH.LH].HH.LH].RH)ELSE BEGIN
Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=MEM[MEM[A].HH.RH].HH.LH;SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END;END;{:668}{669:}PROCEDURE PRINTARG(Q:HALFWORD;
N:INTEGER;B:HALFWORD);
BEGIN IF MEM[Q].HH.RH=1 THEN PRINTNL(355)ELSE IF B<2694 THEN PRINTNL(356
)ELSE PRINTNL(357);PRINTINT(N);PRINT(545);
IF MEM[Q].HH.RH=1 THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,1000);END;
{:669}PROCEDURE GETXNEXT;FORWARD;
PROCEDURE MACROCALL(DEFREF,ARGLIST,MACRONAME:HALFWORD);LABEL 40,30;
VAR R:HALFWORD;P,Q:HALFWORD;N:INTEGER;LDELIM,RDELIM:HALFWORD;
BALANCE:INTEGER;TAIL:HALFWORD;PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;
BEGIN R:=MEM[DEFREF].HH.RH;MEM[DEFREF].HH.LH:=MEM[DEFREF].HH.LH+1;
IF INTERNAL[7]>0 THEN{667:}BEGIN BEGINDIAGNOS;PRINTLN;
PRINTMACRONA(ARGLIST,MACRONAME);SHOWMACRO(DEFREF,0,1000);
IF ARGLIST<>0 THEN BEGIN N:=0;P:=ARGLIST;REPEAT Q:=MEM[P].HH.LH;
PRINTARG(Q,N,0);N:=N+1;P:=MEM[P].HH.RH;UNTIL P=0;END;
ENDDIAGNOSTI(FALSE);END{:667};IF ARGLIST=0 THEN N:=0 ELSE{670:}
BEGIN N:=1;TAIL:=ARGLIST;WHILE MEM[TAIL].HH.RH<>0 DO BEGIN N:=N+1;
TAIL:=MEM[TAIL].HH.RH;END;END{:670};{671:}CURCMD:=79;
WHILE MEM[R].HH.LH>=2394 DO BEGIN{672:}
IF CURCMD<>78 THEN BEGIN GETXNEXT;
IF CURCMD<>30 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(551);END;PRINTMACRONA(ARGLIST,MACRONAME);
BEGIN HELPPTR:=3;HELPLINE[2]:=552;HELPLINE[1]:=553;HELPLINE[0]:=554;END;
IF MEM[R].HH.LH>=2544 THEN BEGIN CUREXP:=0;CURTYPE:=21;
END ELSE BEGIN CUREXP:=0;CURTYPE:=16;END;BACKERROR;CURCMD:=62;GOTO 40;
END;LDELIM:=CURSYM;RDELIM:=CURMOD;END;{675:}
IF MEM[R].HH.LH>=2694 THEN{676:}BEGIN WARNINGINFO:=LDELIM;
SCANNERSTATU:=3;PARAMSETTING:=PARAMPTR;EXPRARGRENUM:=FALSE;P:=26001;
BALANCE:=1;MEM[26001].HH.RH:=0;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM>=2244 THEN{678:}
IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURMOD:=MEM[CURMOD+1].INT;CURCMD:=40;
CURSYM:=0;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE IF(MEM[CURMOD].HH.B0<>16)AND(MEM[MEM[R].HH.RH].HH.LH=0)THEN
BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR-N-1;END ELSE{679:}
BEGIN IF MEM[CURMOD].HH.B0=16 THEN CURMOD:=MEM[CURMOD+1].INT ELSE BEGIN
DISPERR(CURMOD,558);BEGIN HELPPTR:=3;HELPLINE[2]:=559;HELPLINE[1]:=560;
HELPLINE[0]:=561;END;ERROR;CURMOD:=0;END;CURSYM:=0;CURCMD:=41;END{:679}
{:678}ELSE IF CURCMD=62 THEN BEGIN IF CURMOD=LDELIM THEN BEGIN BALANCE:=
BALANCE-1;IF BALANCE=0 THEN GOTO 30;END;
END ELSE IF CURCMD=30 THEN IF CURMOD=RDELIM THEN BALANCE:=BALANCE+1;
MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;30:CUREXP:=MEM[26001].HH.RH;
CURTYPE:=21;SCANNERSTATU:=0;IF EXPRARGRENUM THEN{680:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(562)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=26003{:680};
END{:676}ELSE BEGIN GETXNEXT;
IF MEM[R].HH.LH>=2544 THEN SCANSUFFIX ELSE SCANEXPRESSI;END{:675};
IF CURCMD<>78 THEN{673:}
IF(CURCMD<>62)OR(CURMOD<>LDELIM)THEN IF MEM[MEM[R].HH.RH].HH.LH>=2394
THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=3;HELPLINE[2]:=555;
HELPLINE[1]:=556;HELPLINE[0]:=550;END;BACKERROR;CURCMD:=78;
END ELSE BEGIN MISSINGERR(HASH[RDELIM].RH);BEGIN HELPPTR:=2;
HELPLINE[1]:=557;HELPLINE[0]:=550;END;BACKERROR;END{:673};40:{674:}
BEGIN P:=GETAVAIL;
IF CURTYPE=21 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:674}{:672};R:=MEM[R].HH.RH;END;
IF CURCMD=78 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(546);END;PRINTMACRONA(ARGLIST,MACRONAME);
PRINTCHAR(59);PRINTNL(547);PRINT(HASH[RDELIM].RH);PRINT(171);
BEGIN HELPPTR:=3;HELPLINE[2]:=548;HELPLINE[1]:=549;HELPLINE[0]:=550;END;
ERROR;END;IF MEM[R].HH.LH<>0 THEN{681:}BEGIN GETXNEXT;
CASE MEM[R].HH.LH OF 1:SCANPRIMARY;2:SCANSECONDAR;3:SCANTERTIARY;
4:SCANEXPRESSI;5:BEGIN SCANEXPRESSI;P:=GETAVAIL;
MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN PRINTARG(MEM[P].HH.LH,N,0);
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
IF CURCMD<>67 THEN BEGIN MISSINGERR(338);PRINT(563);
PRINTMACRONA(ARGLIST,MACRONAME);BEGIN HELPPTR:=1;HELPLINE[0]:=564;END;
BACKERROR;END;GETXNEXT;SCANPRIMARY;END;END;BACKINPUT;{674:}
BEGIN P:=GETAVAIL;
IF CURTYPE=21 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:674};END{:681};R:=MEM[R].HH.RH{:671};{682:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF PARAMPTR+N>MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=PARAMPTR+N;
IF MAXPARAMSTAC>150 THEN OVERFLOW(531,150);END;BEGINTOKENLI(DEFREF,12);
CURINPUT.NAMEFIELD:=MACRONAME;CURINPUT.LOCFIELD:=R;
IF N>0 THEN BEGIN P:=ARGLIST;REPEAT PARAMSTACK[PARAMPTR]:=MEM[P].HH.LH;
PARAMPTR:=PARAMPTR+1;P:=MEM[P].HH.RH;UNTIL P=0;FLUSHLIST(ARGLIST);
END{:682};END;{:666}PROCEDURE GETBOOLEAN;FORWARD;PROCEDURE PASSTEXT;
FORWARD;PROCEDURE CONDITIONAL;FORWARD;PROCEDURE STARTINPUT;FORWARD;
PROCEDURE BEGINITERATI;FORWARD;PROCEDURE RESUMEITERAT;FORWARD;
PROCEDURE STOPITERATIO;FORWARD;{:655}{656:}PROCEDURE GETXNEXT;
VAR P:HALFWORD;SAVEEXP:HALFWORD;BEGIN GETNEXT;
IF CURCMD<9 THEN BEGIN SAVEEXP:=STASHCUREXP;REPEAT{657:}
BEGIN IF INTERNAL[6]>65536 THEN IF CURCMD<>8 THEN SHOWCMDMOD(CURCMD,
CURMOD);CASE CURCMD OF 1:CONDITIONAL;2:{697:}
IF CURMOD>IFLIMIT THEN IF IFLIMIT=1 THEN BEGIN BACKINPUT;CURSYM:=2234;
BACKINPUT;END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(571);END;PRINTCMDMOD(2,CURMOD);BEGIN HELPPTR:=1;
HELPLINE[0]:=572;END;ERROR;END ELSE BEGIN WHILE CURMOD<>2 DO PASSTEXT;
{691:}BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:691};
END{:697};3:{661:}IF CURMOD>0 THEN FORCEEOF:=TRUE ELSE STARTINPUT{:661};
4:IF CURMOD=0 THEN{658:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(533);END;BEGIN HELPPTR:=2;HELPLINE[1]:=534;
HELPLINE[0]:=535;END;ERROR;END{:658}ELSE BEGINITERATI;5:{662:}
BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO
ENDTOKENLIST;
IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(537);END;BEGIN HELPPTR:=2;HELPLINE[1]:=538;
HELPLINE[0]:=539;END;ERROR;END ELSE RESUMEITERAT;END{:662};6:{663:}
BEGIN GETBOOLEAN;IF INTERNAL[6]>65536 THEN SHOWCMDMOD(32,CUREXP);
IF CUREXP=30 THEN IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(540);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=541;END;IF CURCMD=79 THEN ERROR ELSE BACKERROR;
END ELSE{664:}BEGIN P:=0;
REPEAT IF(CURINPUT.INDEXFIELD<=6)THEN ENDFILEREADI ELSE BEGIN IF
CURINPUT.INDEXFIELD=7 THEN P:=CURINPUT.STARTFIELD;ENDTOKENLIST;END;
UNTIL P<>0;IF P<>MEM[LOOPPTR].HH.LH THEN FATALERROR(544);STOPITERATIO;
END{:664}ELSE IF CURCMD<>79 THEN BEGIN MISSINGERR(59);BEGIN HELPPTR:=2;
HELPLINE[1]:=542;HELPLINE[0]:=543;END;BACKERROR;END;END{:663};7:;
8:MACROCALL(CURMOD,0,CURSYM);END;END{:657};GETNEXT;UNTIL CURCMD>=9;
UNSTASHCUREX(SAVEEXP);END;END;{:656}{683:}
PROCEDURE STACKARGUMEN(P:HALFWORD);
BEGIN IF PARAMPTR=MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=MAXPARAMSTAC+1;
IF MAXPARAMSTAC>150 THEN OVERFLOW(531,150);END;PARAMSTACK[PARAMPTR]:=P;
PARAMPTR:=PARAMPTR+1;END;{:683}{688:}PROCEDURE PASSTEXT;LABEL 30;
VAR L:INTEGER;BEGIN SCANNERSTATU:=1;L:=0;WARNINGINFO:=LINE;
WHILE TRUE DO BEGIN GETNEXT;
IF CURCMD<=2 THEN IF CURCMD<2 THEN L:=L+1 ELSE BEGIN IF L=0 THEN GOTO 30
;IF CURMOD=2 THEN L:=L-1;END ELSE{689:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:689}
;END;30:SCANNERSTATU:=0;END;{:688}{692:}
PROCEDURE CHANGEIFLIMI(L:SMALLNUMBER;P:HALFWORD);LABEL 10;
VAR Q:HALFWORD;BEGIN IF P=CONDPTR THEN IFLIMIT:=L ELSE BEGIN Q:=CONDPTR;
WHILE TRUE DO BEGIN IF Q=0 THEN CONFUSION(565);
IF MEM[Q].HH.RH=P THEN BEGIN MEM[Q].HH.B0:=L;GOTO 10;END;
Q:=MEM[Q].HH.RH;END;END;10:END;{:692}{693:}PROCEDURE CHECKCOLON;
BEGIN IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=2;
HELPLINE[1]:=568;HELPLINE[0]:=543;END;BACKERROR;END;END;{:693}{694:}
PROCEDURE CONDITIONAL;LABEL 10,30,21,40;VAR SAVECONDPTR:HALFWORD;
P:HALFWORD;BEGIN{690:}BEGIN P:=GETNODE(2);MEM[P].HH.RH:=CONDPTR;
MEM[P].HH.B0:=IFLIMIT;MEM[P].HH.B1:=CURIF;MEM[P+1].INT:=IFLINE;
CONDPTR:=P;IFLIMIT:=1;IFLINE:=LINE;END{:690};SAVECONDPTR:=CONDPTR;
21:CURIF:=CURMOD;GETBOOLEAN;IF INTERNAL[6]>65536 THEN{696:}
BEGIN BEGINDIAGNOS;IF CUREXP=30 THEN PRINT(569)ELSE PRINT(570);
ENDDIAGNOSTI(FALSE);END{:696};40:CHECKCOLON;
IF CUREXP=30 THEN BEGIN CHANGEIFLIMI(4,SAVECONDPTR);GOTO 10;END;{695:}
WHILE TRUE DO BEGIN PASSTEXT;
IF CONDPTR=SAVECONDPTR THEN GOTO 30 ELSE IF CURMOD=2 THEN{691:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:691};
END{:695};30:IF CURMOD=2 THEN{691:}BEGIN P:=CONDPTR;
IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;IFLIMIT:=MEM[P].HH.B0;
CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:691}
ELSE IF CURMOD=4 THEN GOTO 21 ELSE BEGIN CUREXP:=30;IFLIMIT:=2;GETXNEXT;
GOTO 40;END;10:END;{:694}{699:}PROCEDURE BADFOR(S:STRNUMBER);
BEGIN DISPERR(0,573);PRINT(S);PRINT(178);BEGIN HELPPTR:=4;
HELPLINE[3]:=574;HELPLINE[2]:=575;HELPLINE[1]:=576;HELPLINE[0]:=180;END;
FLUSHERROR(0);END;{:699}{700:}PROCEDURE BEGINITERATI;LABEL 30,40;
VAR M:HALFWORD;N:HALFWORD;P,Q,R,S,PP:HALFWORD;BEGIN M:=CURMOD;N:=CURSYM;
S:=GETNODE(2);IF M=1 THEN BEGIN MEM[S+1].HH.LH:=1;P:=0;GETNEXT;GOTO 40;
END;GETSYMBOL;P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=M;
GETNEXT;IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=3;HELPLINE[2]:=577;HELPLINE[1]:=517;HELPLINE[0]:=578;END;
BACKERROR;END;{709:}Q:=S+1;REPEAT GETXNEXT;R:=GETAVAIL;
IF M=2394 THEN BEGIN SCANEXPRESSI;IF CURCMD=73 THEN{710:}
BEGIN IF CURTYPE<>16 THEN BADFOR(584);PP:=GETNODE(4);
MEM[PP+1].INT:=CUREXP;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BADFOR(585);MEM[PP+2].INT:=CUREXP;
IF CURCMD<>74 THEN BEGIN MISSINGERR(348);BEGIN HELPPTR:=2;
HELPLINE[1]:=586;HELPLINE[0]:=587;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN BADFOR(588);MEM[PP+3].INT:=CUREXP;
MEM[S+1].HH.LH:=PP;GOTO 30;END{:710};MEM[R].HH.LH:=STASHCUREXP;
END ELSE BEGIN SCANSUFFIX;MEM[R].HH.LH:=CUREXP;END;MEM[Q].HH.RH:=R;Q:=R;
CURTYPE:=1;UNTIL CURCMD<>78;MEM[S+1].HH.LH:=0;30:{:709};40:{701:}
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=3;
HELPLINE[2]:=579;HELPLINE[1]:=580;HELPLINE[0]:=581;END;BACKERROR;
END{:701};{703:}Q:=GETAVAIL;MEM[Q].HH.LH:=2230;SCANNERSTATU:=6;
WARNINGINFO:=N;MEM[S].HH.LH:=SCANTOKS(4,P,Q,0);SCANNERSTATU:=0;
MEM[S].HH.RH:=LOOPPTR;LOOPPTR:=S{:703};RESUMEITERAT;END;{:700}{705:}
PROCEDURE RESUMEITERAT;LABEL 45,10;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;IF P>1 THEN BEGIN CUREXP:=MEM[P+1].INT;
IF{706:}
((MEM[P+2].INT>0)AND(CUREXP>MEM[P+3].INT))OR((MEM[P+2].INT<0)AND(CUREXP<
MEM[P+3].INT)){:706}THEN GOTO 45;CURTYPE:=16;Q:=STASHCUREXP;
MEM[P+1].INT:=CUREXP+MEM[P+2].INT;
END ELSE IF P<1 THEN BEGIN P:=MEM[LOOPPTR+1].HH.RH;IF P=0 THEN GOTO 45;
MEM[LOOPPTR+1].HH.RH:=MEM[P].HH.RH;Q:=MEM[P].HH.LH;
BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;
BEGINTOKENLI(MEM[LOOPPTR].HH.LH,7);IF P<>1 THEN STACKARGUMEN(Q);
IF INTERNAL[6]>65536 THEN{707:}IF P<>1 THEN BEGIN PRINTNL(583);
IF(Q<>0)AND(MEM[Q].HH.RH=1)THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,50);
PRINTCHAR(125);END{:707};GOTO 10;45:STOPITERATIO;10:END;{:705}{708:}
PROCEDURE STOPITERATIO;VAR P,Q:HALFWORD;BEGIN P:=MEM[LOOPPTR+1].HH.LH;
IF P>1 THEN FREENODE(P,4)ELSE IF P<1 THEN BEGIN Q:=MEM[LOOPPTR+1].HH.RH;
WHILE Q<>0 DO BEGIN P:=MEM[Q].HH.LH;
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);P:=Q;Q:=MEM[Q].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;END;P:=LOOPPTR;
LOOPPTR:=MEM[P].HH.RH;FLUSHTOKENLI(MEM[P].HH.LH);FREENODE(P,2);END;
{:708}{715:}PROCEDURE BEGINNAME;BEGIN AREADELIMITE:=0;EXTDELIMITER:=0;
END;{:715}{716:}FUNCTION MORENAME(C:ASCIICODE):BOOLEAN;
BEGIN IF C=32 THEN MORENAME:=FALSE ELSE BEGIN IF C=91 THEN AREADELIMITE
:=POOLPTR ELSE IF C=46 THEN EXTDELIMITER:=POOLPTR;
BEGIN IF POOLPTR+1>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
BEGIN STRPOOL[POOLPTR]:=C;POOLPTR:=POOLPTR+1;END;MORENAME:=TRUE;END;END;
{:716}{717:}PROCEDURE ENDNAME;
BEGIN IF STRPTR+3>MAXSTRINGS THEN OVERFLOW(130,MAXSTRINGS-INITSTRPTR);
CURNAME:=STRPTR;
IF EXTDELIMITER=0 THEN CUREXT:=312 ELSE BEGIN STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=EXTDELIMITER;CUREXT:=STRPTR;END;
IF AREADELIMITE<=STRSTART[STRPTR]THEN BEGIN CURAREA:=312;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
END ELSE BEGIN STRPTR:=STRPTR+1;STRSTART[STRPTR]:=AREADELIMITE;
CURAREA:=MAKESTRING;END;END;{:717}{719:}
PROCEDURE PACKFILENAME(N,A,E:STRNUMBER);VAR K:INTEGER;C:ASCIICODE;
J:POOLPOINTER;BEGIN K:=0;
IF(E=590)AND((STRSTART[N+1]-STRSTART[N])>6)THEN BEGIN FOR J:=STRSTART[N]
TO STRSTART[N]+2 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[N+1]-3 TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
END ELSE FOR J:=STRSTART[N]TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];
K:=K+1;IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[E]TO STRSTART[E+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:719}
{723:}PROCEDURE PACKBUFFERED(N:SMALLNUMBER;A,B:INTEGER);VAR K:INTEGER;
C:ASCIICODE;J:INTEGER;D:INTEGER;
BEGIN IF N+B-A+5>FILENAMESIZE THEN B:=A+FILENAMESIZE-N-5;K:=0;
FOR J:=A TO B DO BEGIN C:=BUFFER[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF B=0 THEN BEGIN D:=10;N:=18;END ELSE D:=6;
FOR J:=D TO 9 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=18-N+1 TO 18 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:723}
{725:}PROCEDURE CURNAM(VAR CHAN:FILE;VAR S:STRING);EXTERN;
FUNCTION MAKENAMESTRI(VAR F:FILE):STRNUMBER;
VAR S:PACKED ARRAY[1..24]OF CHAR;K:1..24;BEGIN CURNAM(F,S);
BEGIN IF POOLPTR+24>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
END;K:=1;WHILE ORD(S[K])<>0 DO BEGIN BEGIN STRPOOL[POOLPTR]:=XORD[S[K]];
POOLPTR:=POOLPTR+1;END;K:=K+1;END;MAKENAMESTRI:=MAKESTRING;END;
FUNCTION AMAKENAMESTR(VAR F:ALPHAFILE):STRNUMBER;
BEGIN AMAKENAMESTR:=MAKENAMESTRI(F);END;
FUNCTION BMAKENAMESTR(VAR F:BYTEFILE):STRNUMBER;
BEGIN BMAKENAMESTR:=MAKENAMESTRI(F);END;
FUNCTION WMAKENAMESTR(VAR F:WORDFILE):STRNUMBER;
BEGIN WMAKENAMESTR:=MAKENAMESTRI(F);END;{:725}{726:}
PROCEDURE SCANFILENAME;LABEL 30;BEGIN BEGINNAME;
WHILE BUFFER[CURINPUT.LOCFIELD]=32 DO CURINPUT.LOCFIELD:=CURINPUT.
LOCFIELD+1;
WHILE TRUE DO BEGIN IF(BUFFER[CURINPUT.LOCFIELD]=59)OR(BUFFER[CURINPUT.
LOCFIELD]=37)THEN GOTO 30;
IF NOT MORENAME(BUFFER[CURINPUT.LOCFIELD])THEN GOTO 30;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;30:ENDNAME;END;{:726}{729:}
PROCEDURE PACKJOBNAME(S:STRNUMBER);BEGIN CURAREA:=312;CUREXT:=S;
CURNAME:=JOBNAME;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;{:729}{730:}
PROCEDURE PROMPTFILENA(S,E:STRNUMBER);LABEL 30;VAR K:0..BUFSIZE;
I:POOLPOINTER;BEGIN IF INTERACTION=2 THEN WAKEUPTERMIN;
IF S=591 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(592);END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(593);END;PRINTFILENAM(CURNAME,CURAREA,CUREXT);
PRINT(594);IF E=595 THEN SHOWCONTEXT;PRINTNL(596);PRINT(S);
IF INTERACTION<2 THEN FATALERROR(597);BREAKIN(TTY,TRUE);
FOR I:=STRSTART[CURNAME]TO STRSTART[CURNAME+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CUREXT]TO STRSTART[CUREXT+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CURAREA]TO STRSTART[CURAREA+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));PTWR1W(0,140);BEGIN BEGIN IF INSKP0 THEN END;PRINT(598);
TERMINPUT;END;{731:}BEGIN BEGINNAME;K:=FIRST;
WHILE(BUFFER[K]=32)AND(K<LAST)DO K:=K+1;
WHILE TRUE DO BEGIN IF K=LAST THEN GOTO 30;
IF NOT MORENAME(BUFFER[K])THEN GOTO 30;K:=K+1;END;30:ENDNAME;END{:731};
IF CUREXT=312 THEN CUREXT:=E;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;
{:730}{732:}PROCEDURE OPENLOGFILE;VAR OLDSETTING:0..5;K:0..BUFSIZE;
L:0..BUFSIZE;M:INTEGER;MONTHS:PACKED ARRAY[1..36]OF CHAR;
BEGIN OLDSETTING:=SELECTOR;IF JOBNAME=0 THEN JOBNAME:=599;
PACKJOBNAME(600);WHILE NOT AOPENOUT(LOGFILE)DO{733:}
BEGIN IF INTERACTION<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(593);END;
PRINTFILENAM(CURNAME,CURAREA,CUREXT);PRINT(594);JOBNAME:=0;HISTORY:=3;
JUMPOUT;END;PROMPTFILENA(602,600);END{:733};
LOGNAME:=AMAKENAMESTR(LOGFILE);SELECTOR:=2;{734:}
BEGIN WRITE(LOGFILE,'This is METAFONT, WAITS Version -40.0');
PRINT(BASEIDENT);PRINT(603);PRINTINT(ROUNDUNSCALE(INTERNAL[14]));
PRINTCHAR(32);MONTHS:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
M:=ROUNDUNSCALE(INTERNAL[13]);
FOR K:=3*M-2 TO 3*M DO WRITE(LOGFILE,MONTHS[K]);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12]));PRINTCHAR(32);
M:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(M DIV 60);PRINTCHAR(58);
PRINTDD(M MOD 60);END{:734};INPUTSTACK[INPUTPTR]:=CURINPUT;PRINTNL(601);
L:=INPUTSTACK[0].LIMITFIELD-1;FOR K:=1 TO L DO PRINT(BUFFER[K]);PRINTLN;
SELECTOR:=OLDSETTING+2;END;{:732}{737:}PROCEDURE STARTINPUT;LABEL 30;
BEGIN{739:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF(CURINPUT.INDEXFIELD>6)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(606);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=607;HELPLINE[1]:=608;HELPLINE[0]:=609;END;ERROR;END;
IF(CURINPUT.INDEXFIELD<=6)THEN SCANFILENAME ELSE BEGIN CURNAME:=312;
CUREXT:=312;CURAREA:=312;END{:739};IF CUREXT=312 THEN CUREXT:=595;
PACKFILENAME(CURNAME,CURAREA,CUREXT);WHILE TRUE DO BEGIN BEGINFILEREA;
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;
PACKFILENAME(CURNAME,589,CUREXT);
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;ENDFILEREADI;
PROMPTFILENA(591,595);END;
30:CURINPUT.NAMEFIELD:=AMAKENAMESTR(INPUTFILE[CURINPUT.INDEXFIELD]);
STRREF[CURNAME]:=127;IF JOBNAME=0 THEN BEGIN JOBNAME:=CURNAME;
OPENLOGFILE;END;
IF TERMOFFSET+(STRSTART[CURINPUT.NAMEFIELD+1]-STRSTART[CURINPUT.
NAMEFIELD])>MAXPRINTLINE-2 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(40);PRINT(CURINPUT.NAMEFIELD);
BREAK(TTY);
IF CURINPUT.NAMEFIELD=STRPTR-1 THEN BEGIN FLUSHSTRING(CURINPUT.NAMEFIELD
);CURINPUT.NAMEFIELD:=CURNAME;END;{738:}
BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],FALSE)THEN BEGIN IF(LAST
-CURINPUT.STARTFIELD=29)AND(BUFFER[CURINPUT.STARTFIELD]=67)AND(BUFFER[
CURINPUT.STARTFIELD+8]=22)THEN BEGIN WHILE(INPUTFILE[CURINPUT.INDEXFIELD
]↑<>CHR(12))AND(NOT EOF(INPUTFILE[CURINPUT.INDEXFIELD]))DO BEGIN READLN(
INPUTFILE[CURINPUT.INDEXFIELD]);
READ(INPUTFILE[CURINPUT.INDEXFIELD],AUXBUF:TEMPPTR);END;
BUFFER[CURINPUT.STARTFIELD]:=12;LAST:=CURINPUT.STARTFIELD+1;END;END;
PAGE:=1;FIRMUPTHELIN;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
LINE:=1;END{:738};END;{:737}{762:}PROCEDURE BADEXP(S:STRNUMBER);
VAR SAVEFLAG:0..81;BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(S);END;PRINT(618);PRINTCMDMOD(CURCMD,CURMOD);
PRINTCHAR(39);BEGIN HELPPTR:=4;HELPLINE[3]:=619;HELPLINE[2]:=620;
HELPLINE[1]:=621;HELPLINE[0]:=622;END;BACKINPUT;CURSYM:=0;CURCMD:=41;
CURMOD:=0;INSERROR;SAVEFLAG:=VARFLAG;VARFLAG:=0;GETXNEXT;
VARFLAG:=SAVEFLAG;END;{:762}{765:}PROCEDURE STASHIN(P:HALFWORD);
BEGIN MEM[P].HH.B0:=CURTYPE;
IF CURTYPE=16 THEN MEM[P+1].INT:=CUREXP ELSE BEGIN MEM[P+1]:=MEM[CUREXP
+1];MEM[MEM[P+1].HH.LH].HH.RH:=P;FREENODE(CUREXP,2);END;CURTYPE:=1;END;
{:765}{784:}PROCEDURE BACKEXPR;BEGIN BEGINTOKENLI(26002,9);
STACKARGUMEN(STASHCUREXP);END;{:784}{786:}PROCEDURE BADSUBSCRIPT;
BEGIN DISPERR(0,635);BEGIN HELPPTR:=3;HELPLINE[2]:=636;HELPLINE[1]:=637;
HELPLINE[0]:=638;END;FLUSHERROR(0);END;{:786}{788:}
PROCEDURE OBLITERATED(Q:HALFWORD);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(441);
END;SHOWTOKENLIS(Q,0,1000);PRINT(639);BEGIN HELPPTR:=5;HELPLINE[4]:=640;
HELPLINE[3]:=641;HELPLINE[2]:=642;HELPLINE[1]:=643;HELPLINE[0]:=644;END;
END;{:788}{792:}{793:}FUNCTION CONSTDEPENDE(V:SCALED):HALFWORD;
BEGIN DEPFINAL:=GETNODE(2);MEM[DEPFINAL+1].INT:=V;
MEM[DEPFINAL].HH.LH:=0;CONSTDEPENDE:=DEPFINAL;END;
FUNCTION SINGLEDEPEND(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q+1].INT:=TWOTOTHE[28-MEM[P+1].INT];
MEM[Q].HH.LH:=P;MEM[Q].HH.RH:=CONSTDEPENDE(0);SINGLEDEPEND:=Q;END;{:793}
{794:}FUNCTION COPYDEPLIST(P:HALFWORD):HALFWORD;LABEL 30;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);DEPFINAL:=Q;
WHILE TRUE DO BEGIN MEM[DEPFINAL].HH.LH:=MEM[P].HH.LH;
MEM[DEPFINAL+1].INT:=MEM[P+1].INT;IF MEM[DEPFINAL].HH.LH=0 THEN GOTO 30;
MEM[DEPFINAL].HH.RH:=GETNODE(2);DEPFINAL:=MEM[DEPFINAL].HH.RH;
P:=MEM[P].HH.RH;END;30:COPYDEPLIST:=Q;END;{:794}{795:}
PROCEDURE ENCAPSULATE(P:HALFWORD);BEGIN CUREXP:=GETNODE(2);
MEM[CUREXP].HH.B0:=CURTYPE;MEM[CUREXP].HH.B1:=11;NEWDEP(CUREXP,P);END;
{:795}{797:}PROCEDURE INSTALL(R,Q:HALFWORD);
BEGIN IF MEM[Q].HH.B0=16 THEN BEGIN MEM[R+1].INT:=MEM[Q+1].INT;
MEM[R].HH.B0:=16;
END ELSE IF MEM[Q].HH.B0=20 THEN IF MEM[Q+1].INT>20 THEN BEGIN MEM[R].HH
.B0:=16;MEM[R+1].INT:=0;END ELSE BEGIN MEM[R].HH.B0:=17;
NEWDEP(R,SINGLEDEPEND(Q));END ELSE BEGIN MEM[R].HH.B0:=MEM[Q].HH.B0;
NEWDEP(R,COPYDEPLIST(MEM[Q+1].HH.RH));END;END;{:797}
PROCEDURE MAKEEXPCOPY(P:HALFWORD);LABEL 20;VAR Q,R,T:HALFWORD;
BEGIN 20:CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 1,2,16:CUREXP:=MEM[P+1].INT;
3,5,7,10,12:CUREXP:=NEWRINGENTRY(P);4:BEGIN CUREXP:=MEM[P+1].INT;
BEGIN IF STRREF[CUREXP]<127 THEN STRREF[CUREXP]:=STRREF[CUREXP]+1;END;
END;6:BEGIN CUREXP:=MEM[P+1].INT;MEM[CUREXP].HH.LH:=MEM[CUREXP].HH.LH+1;
END;9:CUREXP:=COPYEDGES(MEM[P+1].INT);
11,13,8:CUREXP:=COPYPATH(MEM[P+1].INT);14,15:{796:}
BEGIN IF MEM[P+1].INT=0 THEN INITBIGNODE(P);T:=GETNODE(2);
MEM[T].HH.B1:=11;MEM[T].HH.B0:=CURTYPE;INITBIGNODE(T);
Q:=MEM[P+1].INT+BIGNODESIZE[CURTYPE];
R:=MEM[T+1].INT+BIGNODESIZE[CURTYPE];REPEAT Q:=Q-2;R:=R-2;INSTALL(R,Q);
UNTIL Q=MEM[P+1].INT;CUREXP:=T;END{:796};
17,18:ENCAPSULATE(COPYDEPLIST(MEM[P+1].HH.RH));
19:BEGIN MEM[P].HH.B0:=20;MEM[P+1].INT:=0;GOTO 20;END;
20:IF MEM[P+1].INT>20 THEN BEGIN CURTYPE:=16;CUREXP:=0;
END ELSE BEGIN CURTYPE:=17;ENCAPSULATE(SINGLEDEPEND(P));END;
OTHERS:CONFUSION(648)END;END;{:792}{801:}
PROCEDURE BINARYMAC(P,C,N:HALFWORD);VAR Q,R:HALFWORD;BEGIN Q:=GETAVAIL;
R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[Q].HH.LH:=P;MEM[R].HH.LH:=STASHCUREXP;
MACROCALL(C,Q,N);END;{:801}{804:}PROCEDURE MATERIALIZEP;LABEL 50;
VAR AMINUSB,APLUSB,MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE;P:HALFWORD;
BEGIN IF MEM[CUREXP].HH.B0=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(654);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=655;HELPLINE[0]:=424;END;ERROR;TOSSKNOTLIST(CUREXP);
CUREXP:=3;GOTO 50;END ELSE IF MEM[CUREXP].HH.B0=5 THEN{805:}
BEGIN TX:=MEM[CUREXP+1].INT;TY:=MEM[CUREXP+2].INT;
TXX:=MEM[CUREXP+3].INT-TX;TYX:=MEM[CUREXP+4].INT-TY;
TXY:=MEM[CUREXP+5].INT-TX;TYY:=MEM[CUREXP+6].INT-TY;
AMINUSB:=PYTHADD(TXX-TYY,TYX+TXY);APLUSB:=PYTHADD(TXX+TYY,TYX-TXY);
MAJORAXIS:=(AMINUSB+APLUSB)DIV 2;MINORAXIS:=(ABS(APLUSB-AMINUSB))DIV 2;
IF MAJORAXIS=MINORAXIS THEN THETA:=0 ELSE THETA:=(NARG(TXX-TYY,TYX+TXY)+
NARG(TXX+TYY,TYX-TXY))DIV 2;FREENODE(CUREXP,7);
CUREXP:=MAKEELLIPSE(MAJORAXIS,MINORAXIS,THETA);
IF(TX<>0)OR(TY<>0)THEN{806:}BEGIN P:=CUREXP;
REPEAT MEM[P+1].INT:=MEM[P+1].INT+TX;MEM[P+2].INT:=MEM[P+2].INT+TY;
P:=MEM[P].HH.RH;UNTIL P=CUREXP;END{:806};END{:805};
CUREXP:=MAKEPEN(CUREXP);50:CURTYPE:=6;END;{:804}{809:}{810:}
FUNCTION KNOWNPAIR:HALFWORD;VAR P:HALFWORD;
BEGIN IF CURTYPE<>15 THEN BEGIN DISPERR(0,658);BEGIN HELPPTR:=3;
HELPLINE[2]:=659;HELPLINE[1]:=660;HELPLINE[0]:=661;END;FLUSHERROR(0);
KNOWNPAIR:=0;END ELSE BEGIN P:=MEM[CUREXP+1].INT;FREENODE(CUREXP,2);
{811:}IF MEM[P].HH.B0<>16 THEN BEGIN DISPERR(P,662);BEGIN HELPPTR:=3;
HELPLINE[2]:=663;HELPLINE[1]:=660;HELPLINE[0]:=661;END;ERROR;
RECYCLEVALUE(P);MEM[P].HH.B0:=16;MEM[P+1].INT:=0;END;
IF MEM[P+2].HH.B0<>16 THEN BEGIN DISPERR(P+2,664);BEGIN HELPPTR:=3;
HELPLINE[2]:=665;HELPLINE[1]:=660;HELPLINE[0]:=661;END;ERROR;
RECYCLEVALUE(P+2);MEM[P+2].HH.B0:=16;MEM[P+3].INT:=0;END{:811};
CURTYPE:=1;KNOWNPAIR:=P;END;END;{:810}FUNCTION NEWFRAGMENT:HALFWORD;
VAR Q:HALFWORD;P:HALFWORD;BEGIN Q:=GETNODE(7);MEM[Q].HH.B0:=5;
MEM[Q].HH.B1:=4;MEM[Q+5].INT:=65536;MEM[Q].HH.RH:=Q;P:=KNOWNPAIR;
IF P=0 THEN BEGIN MEM[Q+1].INT:=0;MEM[Q+2].INT:=0;
END ELSE BEGIN MEM[Q+1].INT:=MEM[P+1].INT;MEM[Q+2].INT:=MEM[P+3].INT;
FREENODE(P,4);END;NEWFRAGMENT:=Q;END;{:809}{819:}
FUNCTION FIXFRAGMENT(P:HALFWORD):HALFWORD;VAR R:HALFWORD;BEGIN R:=0;
IF MEM[P].HH.B1=2 THEN IF(MEM[P+5].INT=0)AND(MEM[P+6].INT=0)THEN BEGIN
MEM[P].HH.B1:=4;MEM[P+5].INT:=65536;END ELSE BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[P+5].INT;MEM[R+2].INT:=MEM[P+6].INT;MEM[P+5].INT:=R;
END;MEM[P].HH.B0:=MEM[P].HH.B1;MEM[P+3].INT:=MEM[P+5].INT;
FIXFRAGMENT:=R;END;{:819}{835:}PROCEDURE DONULLARY(C:QUARTERWORD);
VAR K:INTEGER;BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN SHOWCMDMOD(32,C);
CASE C OF 30,31:BEGIN CURTYPE:=2;CUREXP:=C;END;32:BEGIN CURTYPE:=9;
CUREXP:=NEWEDGES;END;33:BEGIN CURTYPE:=6;CUREXP:=3;END;
37:BEGIN CURTYPE:=16;CUREXP:=NORMRAND;END;36:{836:}BEGIN CURTYPE:=8;
CUREXP:=GETNODE(7);MEM[CUREXP].HH.B0:=5;MEM[CUREXP].HH.B1:=5;
MEM[CUREXP].HH.RH:=CUREXP;MEM[CUREXP+1].INT:=0;MEM[CUREXP+2].INT:=0;
MEM[CUREXP+3].INT:=65536;MEM[CUREXP+4].INT:=0;MEM[CUREXP+5].INT:=0;
MEM[CUREXP+6].INT:=65536;END{:836};
34:BEGIN IF JOBNAME=0 THEN OPENLOGFILE;CURTYPE:=4;CUREXP:=JOBNAME;END;
35:{837:}BEGIN IF INTERACTION<=1 THEN FATALERROR(532);BEGINFILEREA;
CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;PRINT(312);
TERMINPUT;END;
BEGIN IF POOLPTR+LAST-CURINPUT.STARTFIELD>POOLSIZE THEN OVERFLOW(129,
POOLSIZE-INITPOOLPTR);END;
FOR K:=CURINPUT.STARTFIELD TO LAST-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K
];POOLPTR:=POOLPTR+1;END;ENDFILEREADI;CURTYPE:=4;CUREXP:=MAKESTRING;
END{:837};END;BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:835}{838:}
{839:}FUNCTION NICEPAIR(P:HALFWORD;T:QUARTERWORD):BOOLEAN;LABEL 10;
BEGIN IF T=15 THEN BEGIN P:=MEM[P+1].INT;
IF MEM[P].HH.B0=16 THEN IF MEM[P+2].HH.B0=16 THEN BEGIN NICEPAIR:=TRUE;
GOTO 10;END;END;NICEPAIR:=FALSE;10:END;{:839}{840:}
PROCEDURE PRINTKNOWNOR(T:SMALLNUMBER;V:INTEGER);BEGIN PRINTCHAR(40);
IF T<17 THEN IF T<>15 THEN PRINTTYPE(T)ELSE IF NICEPAIR(V,15)THEN PRINT(
211)ELSE PRINT(683)ELSE PRINT(684);PRINTCHAR(41);END;{:840}{841:}
PROCEDURE BADUNARY(C:QUARTERWORD);BEGIN DISPERR(0,685);PRINTOP(C);
PRINTKNOWNOR(CURTYPE,CUREXP);BEGIN HELPPTR:=3;HELPLINE[2]:=686;
HELPLINE[1]:=687;HELPLINE[0]:=688;END;ERROR;END;{:841}{844:}
PROCEDURE NEGATEDEPLIS(P:HALFWORD);LABEL 10;
BEGIN WHILE TRUE DO BEGIN MEM[P+1].INT:=-MEM[P+1].INT;
IF MEM[P].HH.LH=0 THEN GOTO 10;P:=MEM[P].HH.RH;END;10:END;{:844}{848:}
PROCEDURE PAIRTOPATH;BEGIN CUREXP:=NEWFRAGMENT;CURTYPE:=11;
MEM[CUREXP].HH.B0:=0;MEM[CUREXP].HH.B1:=0;END;{:848}{850:}
PROCEDURE TAKEPART(C:QUARTERWORD);VAR P:HALFWORD;N:SMALLNUMBER;
Q:HALFWORD;BEGIN MEM[24].INT:=MEM[CUREXP+1].INT;MEM[23].HH.B0:=CURTYPE;
N:=BIGNODESIZE[CURTYPE];Q:=MEM[24].INT+2*(C-49);CURTYPE:=MEM[Q].HH.B0;
IF CURTYPE=16 THEN BEGIN FREENODE(CUREXP,2);CUREXP:=MEM[Q+1].INT;
END ELSE BEGIN MEM[CUREXP].HH.B0:=CURTYPE;MEM[CUREXP+1]:=MEM[Q+1];
MEM[MEM[CUREXP+1].HH.LH].HH.RH:=CUREXP;MEM[Q].HH.B0:=16;END;
RECYCLEVALUE(23);END;{:850}{852:}PROCEDURE STRTONUM(C:QUARTERWORD);
VAR N:INTEGER;M:ASCIICODE;K:POOLPOINTER;B:8..16;BADCHAR:BOOLEAN;
BEGIN IF C=46 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN N:=-1
ELSE N:=STRPOOL[STRSTART[CUREXP]]ELSE BEGIN IF C=44 THEN B:=8 ELSE B:=16
;N:=0;BADCHAR:=FALSE;
FOR K:=STRSTART[CUREXP]TO STRSTART[CUREXP+1]-1 DO BEGIN M:=STRPOOL[K];
IF(M>=48)AND(M<=57)THEN M:=M-48 ELSE IF(M>=65)AND(M<=70)THEN M:=M-55
ELSE IF(M>=97)AND(M<=102)THEN M:=M-87 ELSE BEGIN BADCHAR:=TRUE;M:=0;END;
IF M>=B THEN BEGIN BADCHAR:=TRUE;M:=0;END;
IF N<32768 DIV B THEN N:=N*B+M ELSE N:=32767;END;{853:}
IF BADCHAR THEN BEGIN DISPERR(0,690);IF C=44 THEN BEGIN HELPPTR:=1;
HELPLINE[0]:=691;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=692;END;ERROR;
END;IF N>4095 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(693);END;PRINTINT(N);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=694;END;ERROR;END{:853};END;FLUSHCUREXP(N*65536);END;{:852}
{854:}FUNCTION PATHLENGTH:SCALED;VAR N:SCALED;P:HALFWORD;
BEGIN P:=CUREXP;IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;
REPEAT P:=MEM[P].HH.RH;N:=N+65536;UNTIL P=CUREXP;PATHLENGTH:=N;END;
{:854}{856:}PROCEDURE TESTKNOWN;LABEL 30;VAR B:30..31;P,Q:HALFWORD;
BEGIN B:=31;CASE CURTYPE OF 2,4,6,8,9,11,13,16:B:=30;
14,15:BEGIN P:=MEM[CUREXP+1].INT;Q:=P+BIGNODESIZE[CURTYPE];
REPEAT Q:=Q-2;IF MEM[Q].HH.B0<>16 THEN GOTO 30;UNTIL Q=P;B:=30;30:END;
OTHERS:END;FLUSHCUREXP(B);CURTYPE:=2;END;{:856}
PROCEDURE DOUNARY(C:QUARTERWORD);VAR P:HALFWORD;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{842:}BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);PRINT(689);ENDDIAGNOSTI(FALSE);
END{:842};CASE C OF 65:IF CURTYPE<15 THEN BADUNARY(65);66:{843:}
CASE CURTYPE OF 15:BEGIN P:=MEM[CUREXP+1].INT;
IF MEM[P].HH.B0=16 THEN MEM[P+1].INT:=-MEM[P+1].INT ELSE NEGATEDEPLIS(
MEM[P+1].HH.RH);
IF MEM[P+2].HH.B0=16 THEN MEM[P+3].INT:=-MEM[P+3].INT ELSE NEGATEDEPLIS(
MEM[P+3].HH.RH);END;17,18:NEGATEDEPLIS(MEM[CUREXP+1].HH.RH);
16:CUREXP:=-CUREXP;OTHERS:BADUNARY(66)END{:843};{845:}
40:IF CURTYPE<>2 THEN BADUNARY(40)ELSE CUREXP:=61-CUREXP;{:845}{846:}
55,56,57,58,59,60,61,38,62:IF CURTYPE<>16 THEN BADUNARY(C)ELSE CASE C OF
55:CUREXP:=SQUARERT(CUREXP);56:CUREXP:=MEXP(CUREXP);
57:CUREXP:=MLOG(CUREXP);58,59:BEGIN NSINCOS((CUREXP MOD 23592960)*16);
IF C=58 THEN CUREXP:=ROUNDFRACTIO(NSIN)ELSE CUREXP:=ROUNDFRACTIO(NCOS);
END;60:CUREXP:=FLOORSCALED(CUREXP);61:CUREXP:=UNIFRAND(CUREXP);
38:BEGIN IF ODD(ROUNDUNSCALE(CUREXP))THEN CUREXP:=30 ELSE CUREXP:=31;
CURTYPE:=2;END;62:{1103:}BEGIN CUREXP:=ROUNDUNSCALE(CUREXP)MOD 256;
IF CUREXP<0 THEN CUREXP:=CUREXP+256;
IF CHAREXISTS[CUREXP]THEN CUREXP:=30 ELSE CUREXP:=31;CURTYPE:=2;
END{:1103};END;{:846}{847:}
63:IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
FLUSHCUREXP((NARG(MEM[P+1].INT,MEM[P+3].INT)+8)DIV 16)END ELSE BADUNARY(
63);{:847}{849:}
49,50:IF(CURTYPE<=15)AND(CURTYPE>=14)THEN TAKEPART(C)ELSE BADUNARY(C);
51,52,53,54:IF CURTYPE=14 THEN TAKEPART(C)ELSE BADUNARY(C);{:849}{851:}
47:IF CURTYPE<>16 THEN BADUNARY(47)ELSE BEGIN CUREXP:=ROUNDUNSCALE(
CUREXP)MOD 128;CURTYPE:=4;IF CUREXP<0 THEN CUREXP:=CUREXP+128;END;
41:IF CURTYPE<>16 THEN BADUNARY(41)ELSE BEGIN OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINTSCALED(CUREXP);CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;
CURTYPE:=4;END;44,45,46:IF CURTYPE<>4 THEN BADUNARY(C)ELSE STRTONUM(C);
48:IF CURTYPE=4 THEN BEGIN BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[
CUREXP]>1 THEN STRREF[CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP)
;END;CURTYPE:=16;CUREXP:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])*65536;
END ELSE IF CURTYPE=11 THEN FLUSHCUREXP(PATHLENGTH)ELSE IF CURTYPE=15
THEN FLUSHCUREXP(0)ELSE BADUNARY(C);{:851}{855:}
2:BEGIN IF(CURTYPE>=2)AND(CURTYPE<=3)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
4:BEGIN IF(CURTYPE>=4)AND(CURTYPE<=5)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
6:BEGIN IF(CURTYPE>=6)AND(CURTYPE<=8)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
9:BEGIN IF(CURTYPE>=9)AND(CURTYPE<=10)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
11:BEGIN IF(CURTYPE>=11)AND(CURTYPE<=13)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
14,15:BEGIN IF CURTYPE=C THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);
CURTYPE:=2;END;
19:BEGIN IF(CURTYPE>=16)AND(CURTYPE<=18)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;39:TESTKNOWN;{:855}{857:}
64:BEGIN IF CURTYPE<>11 THEN FLUSHCUREXP(31)ELSE IF MEM[CUREXP].HH.B0<>0
THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);CURTYPE:=2;END;{:857}{858:}
43:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF CURTYPE=11 THEN CURTYPE:=8 ELSE BADUNARY(43);END;
42:IF CURTYPE=11 THEN BEGIN P:=MEM[HTAPYPOC(CUREXP)].HH.RH;
TOSSKNOTLIST(CUREXP);CUREXP:=P;
END ELSE IF CURTYPE<>15 THEN BADUNARY(42);{:858}END;
BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:838}{859:}{860:}
PROCEDURE BADBINARY(P:HALFWORD;C:QUARTERWORD);BEGIN DISPERR(P,312);
DISPERR(0,685);IF C>=90 THEN PRINTOP(C);PRINTKNOWNOR(MEM[P].HH.B0,P);
IF C>=90 THEN PRINT(338)ELSE PRINTOP(C);PRINTKNOWNOR(CURTYPE,CUREXP);
BEGIN HELPPTR:=3;HELPLINE[2]:=686;HELPLINE[1]:=695;HELPLINE[0]:=696;END;
ERROR;END;{:860}{863:}{869:}PROCEDURE DEPFINISH(V,Q:HALFWORD;
T:SMALLNUMBER);VAR P:HALFWORD;VV:SCALED;
BEGIN IF Q=0 THEN P:=CUREXP ELSE P:=Q;MEM[P+1].HH.RH:=V;MEM[P].HH.B0:=T;
IF MEM[V].HH.LH=0 THEN BEGIN VV:=MEM[V+1].INT;
IF Q=0 THEN FLUSHCUREXP(VV)ELSE BEGIN RECYCLEVALUE(P);MEM[Q].HH.B0:=16;
MEM[Q+1].INT:=VV;END;END ELSE IF Q=0 THEN CURTYPE:=T;END;{:869}
PROCEDURE ADDORSUBTRAC(P,Q:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR S,T:SMALLNUMBER;R,U:HALFWORD;V:INTEGER;
BEGIN IF Q=0 THEN BEGIN T:=CURTYPE;
IF T<17 THEN V:=CUREXP ELSE V:=MEM[CUREXP+1].HH.RH;
END ELSE BEGIN T:=MEM[Q].HH.B0;
IF T<17 THEN V:=MEM[Q+1].INT ELSE V:=MEM[Q+1].HH.RH;END;
IF T=16 THEN BEGIN IF C=66 THEN V:=-V;
IF MEM[P].HH.B0=16 THEN BEGIN V:=MEM[P+1].INT+V;
IF Q=0 THEN CUREXP:=V ELSE MEM[Q+1].INT:=V;GOTO 10;END;{864:}
R:=MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
MEM[R+1].INT:=MEM[R+1].INT+V;IF Q=0 THEN BEGIN Q:=GETNODE(2);CUREXP:=Q;
CURTYPE:=MEM[P].HH.B0;MEM[Q].HH.B1:=11;END;
MEM[Q+1].HH.RH:=MEM[P+1].HH.RH;MEM[Q].HH.B0:=MEM[P].HH.B0;
MEM[Q+1].HH.LH:=MEM[P+1].HH.LH;MEM[MEM[P+1].HH.LH].HH.RH:=Q;
MEM[P].HH.B0:=16;{:864};END ELSE BEGIN IF C=66 THEN NEGATEDEPLIS(V);
{865:}IF MEM[P].HH.B0=16 THEN{867:}
BEGIN WHILE MEM[V].HH.LH<>0 DO V:=MEM[V].HH.RH;
MEM[V+1].INT:=MEM[P+1].INT+MEM[V+1].INT;END{:867}
ELSE BEGIN S:=MEM[P].HH.B0;R:=MEM[P+1].HH.RH;
IF T=17 THEN BEGIN IF S=17 THEN IF MAXCOEF(R)+MAXCOEF(V)<626349397 THEN
BEGIN V:=PPLUSQ(V,R,17);GOTO 30;END;{866:}T:=18;U:=V;
WHILE MEM[U].HH.LH<>0 DO BEGIN MEM[U+1].INT:=ROUNDFRACTIO(MEM[U+1].INT);
U:=MEM[U].HH.RH;END{:866};END;
IF S=18 THEN V:=PPLUSQ(V,R,18)ELSE V:=PPLUSFQ(V,65536,R,18);
IF FIXNEEDED THEN FIXDEPENDENC;30:{868:}
IF Q<>0 THEN DEPFINISH(V,Q,T)ELSE BEGIN CURTYPE:=T;DEPFINISH(V,0,T);
END{:868};END{:865};END;10:END;{:863}{877:}PROCEDURE DEPMULT(P:HALFWORD;
V:INTEGER;VISSCALED:BOOLEAN);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
W:FRACTION;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>16 THEN Q:=P ELSE
BEGIN IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM
[P+1].INT:=TAKEFRACTION(MEM[P+1].INT,V);GOTO 10;END;T:=MEM[Q].HH.B0;
Q:=MEM[Q+1].HH.RH;S:=T;
IF T=17 THEN IF VISSCALED THEN IF ABVSCD(MAXCOEF(Q),ABS(V),626349396,
65536)>=0 THEN T:=18;Q:=PTIMESV(Q,V,S,T,VISSCALED);DEPFINISH(Q,P,T);
10:END;{:877}{879:}PROCEDURE HARDTIMES(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;U,V:SCALED;
BEGIN IF MEM[P].HH.B0=15 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);P:=Q;
END;R:=MEM[CUREXP+1].INT;U:=MEM[R+1].INT;V:=MEM[R+3].INT;{880:}
MEM[R+2].HH.B0:=MEM[P].HH.B0;NEWDEP(R+2,COPYDEPLIST(MEM[P+1].HH.RH));
MEM[R].HH.B0:=MEM[P].HH.B0;MEM[R+1]:=MEM[P+1];
MEM[MEM[P+1].HH.LH].HH.RH:=R;FREENODE(P,2){:880};DEPMULT(R,U,TRUE);
DEPMULT(R+2,V,TRUE);END;{:879}{882:}PROCEDURE DEPDIV(P:HALFWORD;
V:SCALED);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;W:FRACTION;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>16 THEN Q:=P ELSE
BEGIN MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);GOTO 10;END;
T:=MEM[Q].HH.B0;Q:=MEM[Q+1].HH.RH;S:=T;
IF T=17 THEN IF ABVSCD(MAXCOEF(Q),65536,626349396,ABS(V))>=0 THEN T:=18;
Q:=POVERV(Q,V,S,T);DEPFINISH(Q,P,T);10:END;{:882}{886:}
PROCEDURE SETUPTRANS(C:QUARTERWORD);LABEL 30,10;VAR P,Q,R:HALFWORD;
BEGIN IF(C<>84)OR(CURTYPE<>14)THEN{888:}BEGIN P:=STASHCUREXP;
CUREXP:=IDTRANSFORM;CURTYPE:=14;Q:=MEM[CUREXP+1].INT;CASE C OF{890:}
80:IF MEM[P].HH.B0=16 THEN{891:}
BEGIN NSINCOS((MEM[P+1].INT MOD 23592960)*16);
MEM[Q+5].INT:=ROUNDFRACTIO(NCOS);MEM[Q+9].INT:=ROUNDFRACTIO(NSIN);
MEM[Q+7].INT:=-MEM[Q+9].INT;MEM[Q+11].INT:=MEM[Q+5].INT;GOTO 30;
END{:891};81:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+6,P);GOTO 30;END;
82:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+4,P);INSTALL(Q+10,P);GOTO 30;
END;83:IF MEM[P].HH.B0=15 THEN BEGIN R:=MEM[P+1].INT;INSTALL(Q,R);
INSTALL(Q+2,R+2);GOTO 30;END;
85:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+4,P);GOTO 30;END;
86:IF MEM[P].HH.B0>15 THEN BEGIN INSTALL(Q+10,P);GOTO 30;END;
87:IF MEM[P].HH.B0=15 THEN{892:}BEGIN R:=MEM[P+1].INT;INSTALL(Q+4,R);
INSTALL(Q+10,R);INSTALL(Q+8,R+2);
IF MEM[R+2].HH.B0=16 THEN MEM[R+3].INT:=-MEM[R+3].INT ELSE NEGATEDEPLIS(
MEM[R+3].HH.RH);INSTALL(Q+6,R+2);GOTO 30;END{:892};84:;{:890}END;
DISPERR(P,703);BEGIN HELPPTR:=2;HELPLINE[1]:=704;HELPLINE[0]:=705;END;
ERROR;30:RECYCLEVALUE(P);FREENODE(P,2);END{:888};{889:}
Q:=MEM[CUREXP+1].INT;R:=Q+12;REPEAT R:=R-2;
IF MEM[R].HH.B0<>16 THEN GOTO 10;UNTIL R=Q;TXX:=MEM[Q+5].INT;
TXY:=MEM[Q+7].INT;TYX:=MEM[Q+9].INT;TYY:=MEM[Q+11].INT;TX:=MEM[Q+1].INT;
TY:=MEM[Q+3].INT;FLUSHCUREXP(0){:889};10:END;{:886}{893:}
PROCEDURE SETUPKNOWNTR(C:QUARTERWORD);BEGIN SETUPTRANS(C);
IF CURTYPE<>16 THEN BEGIN DISPERR(0,706);BEGIN HELPPTR:=2;
HELPLINE[1]:=707;HELPLINE[0]:=708;END;FLUSHERROR(0);TXX:=65536;TXY:=0;
TYX:=0;TYY:=65536;TX:=0;TY:=0;END;END;{:893}{894:}
PROCEDURE TRANS(P,Q:HALFWORD);VAR V:SCALED;
BEGIN V:=TAKESCALED(MEM[P].INT,TXX)+TAKESCALED(MEM[Q].INT,TXY)+TX;
MEM[Q].INT:=TAKESCALED(MEM[P].INT,TYX)+TAKESCALED(MEM[Q].INT,TYY)+TY;
MEM[P].INT:=V;END;{:894}{895:}PROCEDURE PATHTRANS(P:HALFWORD;
C:QUARTERWORD);VAR Q:HALFWORD;BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);
Q:=CUREXP;REPEAT IF MEM[Q].HH.B0<>0 THEN TRANS(Q+3,Q+4);TRANS(Q+1,Q+2);
IF MEM[Q].HH.B1<>0 THEN TRANS(Q+5,Q+6);Q:=MEM[Q].HH.RH;UNTIL Q=CUREXP;
END;{:895}{896:}PROCEDURE EDGESTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);CUREDGES:=CUREXP;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;
IF ABS(TXY)=65536 THEN IF ABS(TYX)=65536 THEN IF TXX=0 THEN IF TYY=0
THEN BEGIN XYSWAPEDGES;TXX:=TXY;TYY:=TYX;TXY:=0;TYX:=0;END;
IF ABS(TXX)=65536 THEN IF ABS(TYY)=65536 THEN IF TXY=0 THEN IF TYX=0
THEN BEGIN IF TXX<0 THEN XREFLECTEDGE;IF TYY<0 THEN YREFLECTEDGE;{897:}
TX:=ROUNDUNSCALE(TX);TY:=ROUNDUNSCALE(TY);
IF(MEM[CUREDGES+2].HH.LH+TX<=0)OR(MEM[CUREDGES+2].HH.RH+TX>=8192)OR(MEM[
CUREDGES+1].HH.LH+TY<=0)OR(MEM[CUREDGES+1].HH.RH+TY>=8191)OR(ABS(TX)>=
4096)OR(ABS(TY)>=4096)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(712);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=713;HELPLINE[0]:=714;END;ERROR;
END ELSE BEGIN IF TX<>0 THEN BEGIN IF NOT(ABS(MEM[CUREDGES+3].HH.LH-TX
-4096)<4096)THEN FIXOFFSET;
MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+2].HH.LH+TX;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+2].HH.RH+TX;
MEM[CUREDGES+3].HH.LH:=MEM[CUREDGES+3].HH.LH-TX;MEM[CUREDGES+4].INT:=0;
END;IF TY<>0 THEN BEGIN MEM[CUREDGES+1].HH.LH:=MEM[CUREDGES+1].HH.LH+TY;
MEM[CUREDGES+1].HH.RH:=MEM[CUREDGES+1].HH.RH+TY;
MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+5].HH.LH+TY;MEM[CUREDGES+4].INT:=0;
END;END{:897};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(709);END;BEGIN HELPPTR:=2;HELPLINE[1]:=710;
HELPLINE[0]:=711;END;ERROR;10:END;{:896}{898:}{900:}
PROCEDURE BILIN1(P:HALFWORD;T:SCALED;Q:HALFWORD;U,DELTA:SCALED);
VAR R:HALFWORD;BEGIN IF T<>65536 THEN DEPMULT(P,T,TRUE);
IF U<>0 THEN IF MEM[Q].HH.B0=16 THEN DELTA:=DELTA+TAKESCALED(MEM[Q+1].
INT,U)ELSE BEGIN{901:}
IF MEM[P].HH.B0<>18 THEN BEGIN IF MEM[P].HH.B0=16 THEN NEWDEP(P,
CONSTDEPENDE(MEM[P+1].INT))ELSE MEM[P+1].HH.RH:=PTIMESV(MEM[P+1].HH.RH,
65536,17,18,TRUE);MEM[P].HH.B0:=18;END{:901};
MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,U,MEM[Q+1].HH.RH,18);END;
IF MEM[P].HH.B0=16 THEN MEM[P+1].INT:=MEM[P+1].INT+DELTA ELSE BEGIN R:=
MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
DELTA:=MEM[R+1].INT+DELTA;
IF R<>MEM[P+1].HH.RH THEN MEM[R+1].INT:=DELTA ELSE BEGIN RECYCLEVALUE(P)
;MEM[P].HH.B0:=16;MEM[P+1].INT:=DELTA;END;END;END;{:900}{903:}
PROCEDURE ADDMULTDEP(P:HALFWORD;V:SCALED;R:HALFWORD);
BEGIN IF MEM[R].HH.B0=16 THEN MEM[DEPFINAL+1].INT:=MEM[DEPFINAL+1].INT+
TAKESCALED(MEM[R+1].INT,V)ELSE MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,V,
MEM[R+1].HH.RH,18);END;{:903}{904:}PROCEDURE BILIN2(P,T:HALFWORD;
V:SCALED;U,Q:HALFWORD);VAR VV:SCALED;R:HALFWORD;BEGIN VV:=MEM[P+1].INT;
MEM[P].HH.B0:=18;NEWDEP(P,CONSTDEPENDE(0));
IF VV<>0 THEN ADDMULTDEP(P,VV,T);IF V<>0 THEN ADDMULTDEP(P,V,U);
IF Q<>0 THEN ADDMULTDEP(P,65536,Q);
IF MEM[P+1].HH.RH=DEPFINAL THEN BEGIN VV:=MEM[DEPFINAL+1].INT;
RECYCLEVALUE(P);MEM[P].HH.B0:=16;MEM[P+1].INT:=VV;END;END;{:904}{906:}
PROCEDURE BILIN3(P:HALFWORD;T,V,U,DELTA:SCALED);
BEGIN IF T<>65536 THEN DELTA:=DELTA+TAKESCALED(MEM[P+1].INT,T)ELSE DELTA
:=DELTA+MEM[P+1].INT;
IF U<>0 THEN MEM[P+1].INT:=DELTA+TAKESCALED(V,U)ELSE MEM[P+1].INT:=DELTA
;END;{:906}PROCEDURE BIGTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
VAR Q,R,PP,QQ:HALFWORD;S:SMALLNUMBER;BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];
Q:=MEM[P+1].INT;R:=Q+S;REPEAT R:=R-2;IF MEM[R].HH.B0<>16 THEN{899:}
BEGIN SETUPKNOWNTR(C);MAKEEXPCOPY(P);R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN1(R+10,TYY,Q+6,TYX,0);
BILIN1(R+8,TYY,Q+4,TYX,0);BILIN1(R+6,TXX,Q+10,TXY,0);
BILIN1(R+4,TXX,Q+8,TXY,0);END;BILIN1(R+2,TYY,Q,TYX,TY);
BILIN1(R,TXX,Q+2,TXY,TX);GOTO 10;END{:899};UNTIL R=Q;{902:}
SETUPTRANS(C);IF CURTYPE=16 THEN{905:}BEGIN MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN3(R+10,TYY,MEM[Q+7].INT,TYX,0);
BILIN3(R+8,TYY,MEM[Q+5].INT,TYX,0);BILIN3(R+6,TXX,MEM[Q+11].INT,TXY,0);
BILIN3(R+4,TXX,MEM[Q+9].INT,TXY,0);END;
BILIN3(R+2,TYY,MEM[Q+1].INT,TYX,TY);BILIN3(R,TXX,MEM[Q+3].INT,TXY,TX);
END{:905}ELSE BEGIN PP:=STASHCUREXP;QQ:=MEM[PP+1].INT;MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=14 THEN BEGIN BILIN2(R+10,QQ+10,MEM[Q+7].INT,QQ+8,0);
BILIN2(R+8,QQ+10,MEM[Q+5].INT,QQ+8,0);
BILIN2(R+6,QQ+4,MEM[Q+11].INT,QQ+6,0);
BILIN2(R+4,QQ+4,MEM[Q+9].INT,QQ+6,0);END;
BILIN2(R+2,QQ+10,MEM[Q+1].INT,QQ+8,QQ+2);
BILIN2(R,QQ+4,MEM[Q+3].INT,QQ+6,QQ);END;{:902};10:END;{:898}{908:}
PROCEDURE CAT(P:HALFWORD);VAR A,B:STRNUMBER;K:POOLPOINTER;
BEGIN A:=MEM[P+1].INT;B:=CUREXP;
BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[B])
>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
FOR K:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;
FOR K:=STRSTART[B]TO STRSTART[B+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[B]<127 THEN IF STRREF[B]>1 THEN STRREF[B]:=STRREF[B]-1
ELSE FLUSHSTRING(B);END;END;{:908}{909:}
PROCEDURE CHOPSTRING(P:HALFWORD);VAR A,B:INTEGER;L:INTEGER;K:INTEGER;
S:STRNUMBER;BEGIN A:=ROUNDUNSCALE(MEM[P+1].INT);
B:=ROUNDUNSCALE(MEM[P+3].INT);S:=CUREXP;L:=(STRSTART[S+1]-STRSTART[S]);
IF A<0 THEN A:=0;IF B>L THEN B:=L;
IF A<B THEN BEGIN BEGIN IF POOLPTR+B-A>POOLSIZE THEN OVERFLOW(129,
POOLSIZE-INITPOOLPTR);END;
FOR K:=STRSTART[S]+A TO STRSTART[S]+B-1 DO BEGIN STRPOOL[POOLPTR]:=
STRPOOL[K];POOLPTR:=POOLPTR+1;END;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[S]<127 THEN IF STRREF[S]>1 THEN STRREF[S]:=STRREF[S]-1
ELSE FLUSHSTRING(S);END;END;{:909}{910:}PROCEDURE CHOPPATH(P:HALFWORD);
VAR Q:HALFWORD;PP,QQ,RR,SS:HALFWORD;A,B,L:SCALED;BEGIN L:=PATHLENGTH;
A:=MEM[P+1].INT;B:=MEM[P+3].INT;{911:}
IF A<0 THEN IF MEM[CUREXP].HH.B0=0 THEN A:=0 ELSE REPEAT A:=A+L;B:=B+L;
UNTIL A>=0;IF B>L THEN IF MEM[CUREXP].HH.B0=0 THEN B:=L{:911};Q:=CUREXP;
WHILE A>=65536 DO BEGIN Q:=MEM[Q].HH.RH;A:=A-65536;B:=B-65536;END;
IF B<=A THEN{913:}BEGIN IF A>0 THEN BEGIN MEM[MEM[Q].HH.RH].HH.B1:=1;
SPLITCUBIC(Q,A*4096);Q:=MEM[Q].HH.RH;END;PP:=COPYKNOT(Q);QQ:=PP;
END{:913}ELSE{912:}BEGIN PP:=COPYKNOT(Q);QQ:=PP;REPEAT Q:=MEM[Q].HH.RH;
RR:=QQ;QQ:=COPYKNOT(Q);MEM[RR].HH.RH:=QQ;B:=B-65536;UNTIL B<=0;
IF A>0 THEN BEGIN MEM[MEM[PP].HH.RH].HH.B1:=1;SPLITCUBIC(PP,A*4096);
SS:=PP;PP:=MEM[PP].HH.RH;FREENODE(SS,7);
IF RR=SS THEN BEGIN B:=MAKESCALED(B,65536-A);RR:=PP;END;END;
IF B<0 THEN BEGIN MEM[QQ].HH.B1:=1;SPLITCUBIC(RR,(B+65536)*4096);
FREENODE(QQ,7);QQ:=MEM[RR].HH.RH;END;END{:912};MEM[PP].HH.B0:=0;
MEM[QQ].HH.B1:=0;MEM[QQ].HH.RH:=PP;TOSSKNOTLIST(CUREXP);CUREXP:=PP;END;
{:910}{914:}PROCEDURE PAIRVALUE(X,Y:SCALED);VAR P:HALFWORD;
BEGIN P:=GETNODE(2);FLUSHCUREXP(P);CURTYPE:=15;MEM[P].HH.B0:=15;
MEM[P].HH.B1:=11;INITBIGNODE(P);P:=MEM[P+1].INT;MEM[P].HH.B0:=16;
MEM[P+1].INT:=X;MEM[P+2].HH.B0:=16;MEM[P+3].INT:=Y;END;{:914}{916:}
PROCEDURE SETUPOFFSET(P:HALFWORD);
BEGIN FINDOFFSET(MEM[P+1].INT,MEM[P+3].INT,CUREXP);PAIRVALUE(CURX,CURY);
END;PROCEDURE SETUPDIRECTI(P:HALFWORD);
BEGIN FLUSHCUREXP(FINDDIRECTIO(MEM[P+1].INT,MEM[P+3].INT,CUREXP));END;
{:916}{917:}PROCEDURE FINDPOINT(V:SCALED;C:QUARTERWORD);LABEL 45,10;
VAR P:HALFWORD;N:SCALED;VV:SCALED;BEGIN VV:=V;P:=CUREXP;
IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;REPEAT P:=MEM[P].HH.RH;
N:=N+65536;UNTIL P=CUREXP;
IF(V<0)OR(V>N)THEN IF MEM[P].HH.B0=0 THEN GOTO 45 ELSE IF N=0 THEN V:=0
ELSE IF V<0 THEN V:=N-1-((-V-1)MOD N)ELSE V:=V MOD N;P:=CUREXP;
WHILE V>=65536 DO BEGIN P:=MEM[P].HH.RH;V:=V-65536;END;
IF V<>0 THEN{919:}BEGIN MEM[MEM[P].HH.RH].HH.B1:=1;SPLITCUBIC(P,V*4096);
P:=MEM[P].HH.RH;END{:919};{920:}
CASE C OF 93:PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT);
94:IF MEM[P].HH.B0=0 THEN GOTO 45 ELSE PAIRVALUE(MEM[P+3].INT,MEM[P+4].
INT);
95:IF MEM[P].HH.B1=0 THEN GOTO 45 ELSE PAIRVALUE(MEM[P+5].INT,MEM[P+6].
INT);END;GOTO 10{:920};45:{918:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(715);
END;PRINTOP(C);PRINTCHAR(32);PRINTSCALED(VV);BEGIN HELPPTR:=2;
HELPLINE[1]:=716;HELPLINE[0]:=717;END;ERROR;PAIRVALUE(0,0);GOTO 10;
END{:918};10:END;{:917}PROCEDURE DOBINARY(P:HALFWORD;C:QUARTERWORD);
LABEL 30,10;VAR Q,R,S:HALFWORD;V:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{861:}BEGIN BEGINDIAGNOS;PRINTNL(697);
PRINTEXP(P,0);PRINTCHAR(41);PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);
PRINT(689);ENDDIAGNOSTI(FALSE);END{:861};CASE C OF 65,66:{862:}
IF(CURTYPE<15)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,C)ELSE IF CURTYPE=15
THEN IF MEM[P].HH.B0<>15 THEN BADBINARY(P,C)ELSE BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,C);ADDORSUBTRAC(Q+2,R+2,C);
END ELSE IF MEM[P].HH.B0=15 THEN BADBINARY(P,C)ELSE ADDORSUBTRAC(P,0,C){
:862};{870:}
72,73,74,75,76,77:BEGIN IF(CURTYPE>15)AND(MEM[P].HH.B0>15)THEN
ADDORSUBTRAC(P,0,66)ELSE IF CURTYPE<>MEM[P].HH.B0 THEN BEGIN BADBINARY(P
,C);GOTO 30;
END ELSE IF CURTYPE=4 THEN FLUSHCUREXP(STRVSSTR(MEM[P+1].INT,CUREXP))
ELSE IF(CURTYPE=5)OR(CURTYPE=3)THEN{872:}BEGIN Q:=MEM[CUREXP+1].INT;
WHILE(Q<>CUREXP)AND(Q<>P)DO Q:=MEM[Q+1].INT;IF Q=P THEN FLUSHCUREXP(0);
END{:872}ELSE IF CURTYPE=15 THEN{873:}BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,66);
IF MEM[R].HH.B0=16 THEN IF MEM[R+1].INT=0 THEN BEGIN ADDORSUBTRAC(Q+2,R
+2,66);TAKEPART(50);END ELSE TAKEPART(49)ELSE TAKEPART(49);END{:873}
ELSE IF CURTYPE=2 THEN FLUSHCUREXP(CUREXP-MEM[P+1].INT)ELSE BEGIN
BADBINARY(P,C);GOTO 30;END;{871:}
IF CURTYPE<>16 THEN BEGIN DISPERR(0,698);BEGIN HELPPTR:=2;
HELPLINE[1]:=699;HELPLINE[0]:=700;END;FLUSHERROR(31);
END ELSE CASE C OF 72:IF CUREXP<0 THEN CUREXP:=30 ELSE CUREXP:=31;
73:IF CUREXP<=0 THEN CUREXP:=30 ELSE CUREXP:=31;
74:IF CUREXP>0 THEN CUREXP:=30 ELSE CUREXP:=31;
75:IF CUREXP>=0 THEN CUREXP:=30 ELSE CUREXP:=31;
76:IF CUREXP=0 THEN CUREXP:=30 ELSE CUREXP:=31;
77:IF CUREXP<>0 THEN CUREXP:=30 ELSE CUREXP:=31;END;CURTYPE:=2{:871};
30:END;{:870}{874:}
71,70:IF(MEM[P].HH.B0<>2)OR(CURTYPE<>2)THEN BADBINARY(P,C)ELSE IF MEM[P
+1].INT=C-40 THEN CUREXP:=MEM[P+1].INT;{:874}{875:}
67:IF(CURTYPE<15)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,67)ELSE IF(CURTYPE=
16)OR(MEM[P].HH.B0=16)THEN{876:}
BEGIN IF MEM[P].HH.B0=16 THEN BEGIN V:=MEM[P+1].INT;FREENODE(P,2);
END ELSE BEGIN V:=CUREXP;UNSTASHCUREX(P);END;
IF CURTYPE=16 THEN CUREXP:=TAKESCALED(CUREXP,V)ELSE IF CURTYPE=15 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,TRUE);DEPMULT(P+2,V,TRUE);
END ELSE DEPMULT(0,V,TRUE);GOTO 10;END{:876}
ELSE IF(NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE>15))OR(NICEPAIR(CUREXP,
CURTYPE)AND(MEM[P].HH.B0>15))THEN BEGIN HARDTIMES(P);GOTO 10;
END ELSE BADBINARY(P,67);{:875}{881:}
68:IF(CURTYPE<>16)OR(MEM[P].HH.B0<15)THEN BADBINARY(P,68)ELSE BEGIN V:=
CUREXP;UNSTASHCUREX(P);IF V=0 THEN{883:}BEGIN DISPERR(0,632);
BEGIN HELPPTR:=2;HELPLINE[1]:=701;HELPLINE[0]:=702;END;ERROR;END{:883}
ELSE BEGIN IF CURTYPE=16 THEN CUREXP:=MAKESCALED(CUREXP,V)ELSE IF
CURTYPE=15 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPDIV(P,V);DEPDIV(P+2,V);
END ELSE DEPDIV(0,V);END;GOTO 10;END;{:881}{884:}
69:IF(CURTYPE=16)AND(MEM[P].HH.B0=16)THEN CUREXP:=PYTHADD(MEM[P+1].INT,
CUREXP)ELSE BADBINARY(P,69);{:884}{885:}
80,81,82,83,84,85,86,87:IF(MEM[P].HH.B0=11)OR(MEM[P].HH.B0=8)THEN BEGIN
PATHTRANS(P,C);GOTO 10;
END ELSE IF(MEM[P].HH.B0=15)OR(MEM[P].HH.B0=14)THEN BIGTRANS(P,C)ELSE IF
MEM[P].HH.B0=9 THEN BEGIN EDGESTRANS(P,C);GOTO 10;
END ELSE BADBINARY(P,C);{:885}{907:}
78:IF(CURTYPE=4)AND(MEM[P].HH.B0=4)THEN CAT(P)ELSE BADBINARY(P,78);
90:IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=4)THEN CHOPSTRING(MEM[P+1].INT
)ELSE BADBINARY(P,90);91:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=11)THEN CHOPPATH(MEM[P+1].INT)
ELSE BADBINARY(P,91);END;{:907}{915:}
93,94,95:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=16)THEN FINDPOINT(MEM[P+1].INT,C)ELSE
BADBINARY(P,C);END;
96:IF(CURTYPE=6)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPOFFSET(MEM[P+1].
INT)ELSE BADBINARY(P,96);92:BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPDIRECTI(MEM[P+1].INT
)ELSE BADBINARY(P,92);END;{:915}{921:}
79:IF(CURTYPE=9)AND(MEM[P].HH.B0=9)THEN BEGIN CUREDGES:=CUREXP;
MERGEEDGES(MEM[P+1].INT);CUREXP:=CUREDGES;END ELSE BADBINARY(P,79);
88:BEGIN IF MEM[P].HH.B0=15 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);
PAIRTOPATH;P:=STASHCUREXP;UNSTASHCUREX(Q);END;
IF CURTYPE=15 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=11)THEN BEGIN PATHINTERSEC(MEM[P+1].INT,
CUREXP);PAIRVALUE(CURT,CURTT);END ELSE BADBINARY(P,88);END;{:921}END;
RECYCLEVALUE(P);FREENODE(P,2);10:BEGIN IF ARITHERROR THEN CLEARARITH;
END;END;{:859}{878:}PROCEDURE FRACMULT(V:FRACTION);VAR P:HALFWORD;
BEGIN IF CURTYPE=16 THEN CUREXP:=TAKEFRACTION(CUREXP,V)ELSE IF CURTYPE=
15 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,FALSE);
DEPMULT(P+2,V,FALSE);END ELSE DEPMULT(0,V,FALSE);END;{:878}{922:}{1080:}
PROCEDURE ARYOUT(VAR F:FILE;B:PACKEDBYTES;O,C:INTEGER);EXTERN;
PROCEDURE WRITEGF(A,B:GFINDEX);
BEGIN ARYOUT(GFFILE,GFBUF,A DIV 4,(B+1-A)DIV 4);{+1000}END;{:1080}
{1081:}PROCEDURE GFSWAP;
BEGIN IF GFLIMIT=GFBUFSIZE THEN BEGIN WRITEGF(0,HALFBUF-1);
GFLIMIT:=HALFBUF;GFOFFSET:=GFOFFSET+GFBUFSIZE;GFPTR:=0;
END ELSE BEGIN WRITEGF(HALFBUF,GFBUFSIZE-1);GFLIMIT:=GFBUFSIZE;END;END;
{:1081}{1083:}PROCEDURE GFFOUR(X:INTEGER);
BEGIN IF X>=0 THEN BEGIN GFBUF[GFPTR]:=X DIV 16777216;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN X:=X+1073741824;
X:=X+1073741824;BEGIN GFBUF[GFPTR]:=(X DIV 16777216)+128;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;X:=X MOD 16777216;
BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;X:=X MOD 65536;
BEGIN GFBUF[GFPTR]:=X DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1083}{1084:}
PROCEDURE GFTWO(X:INTEGER);BEGIN BEGIN GFBUF[GFPTR]:=X DIV 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=X MOD 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;PROCEDURE GFTHREE(X:INTEGER);
BEGIN BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(X MOD 65536)DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1084}{1085:}
PROCEDURE GFPAINT(D:INTEGER);BEGIN IF D<64 THEN BEGIN GFBUF[GFPTR]:=0+D;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF D<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=64;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=65;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(D);END;END;
PROCEDURE GFNEWROW(D:INTEGER);
BEGIN IF ABS(D)<=82 THEN BEGIN GFBUF[GFPTR]:=156+D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=72;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(D);END;END;
{:1085}{1086:}PROCEDURE GFSTRING(S:STRNUMBER);VAR K:POOLPOINTER;
BEGIN FOR K:=STRSTART[S]TO STRSTART[S+1]-1 DO BEGIN GFBUF[GFPTR]:=
STRPOOL[K];GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1086}
{1087:}PROCEDURE INITGF;VAR K:EIGHTBITS;T:INTEGER;
BEGIN GFMINX:=2147483647;GFMAXX:=-2147483647;GFMINY:=2147483647;
GFMAXY:=-2147483647;FOR K:=0 TO 255 DO CHARPTR[K]:=-1;
BEGIN IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(604);
WHILE NOT BOPENOUT(GFFILE)DO PROMPTFILENA(605,604);
OUTPUTFILENA:=BMAKENAMESTR(GFFILE);END;BEGIN GFBUF[GFPTR]:=247;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=129;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINT(892);PRINTINT(ROUNDUNSCALE(INTERNAL[12]));
PRINTCHAR(46);PRINTDD(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTDD(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(58);
T:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(T DIV 60);PRINTDD(T MOD 60);
SELECTOR:=OLDSETTING;BEGIN GFBUF[GFPTR]:=(POOLPTR-STRSTART[STRPTR]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
STRSTART[STRPTR+1]:=POOLPTR;GFSTRING(STRPTR);POOLPTR:=STRSTART[STRPTR];
GFPREVPTR:=GFOFFSET+GFPTR;END;{:1087}{1088:}
PROCEDURE SHIPOUT(C:EIGHTBITS);VAR F:INTEGER;PREVM,M,MM:INTEGER;
MMM:INTEGER;PREVN,N:INTEGER;P,Q:HALFWORD;PREVW,W,WW:INTEGER;D:INTEGER;
DELTA:INTEGER;Z:INTEGER;BEGIN IF OUTPUTFILENA=0 THEN INITGF;
F:=ROUNDUNSCALE(INTERNAL[17]);BEGIN GFBUF[GFPTR]:=67;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(256*F+C);GFFOUR(CHARPTR[C]);
CHARPTR[C]:=GFPREVPTR;{1089:}PREVN:=4096;P:=MEM[CUREDGES].HH.LH;
N:=MEM[CUREDGES+1].HH.RH-4096;WHILE P<>CUREDGES DO BEGIN{1090:}
IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);Q:=MEM[P+1].HH.RH;W:=0;
PREVM:=-268435456;WW:=0;PREVW:=0;M:=PREVM;
REPEAT IF Q=26000 THEN MM:=268435456 ELSE BEGIN D:=MEM[Q].HH.LH;
MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;
IF MM<>M THEN BEGIN IF PREVW<=0 THEN BEGIN IF W>0 THEN{1091:}
BEGIN IF PREVM=-268435456 THEN{1093:}BEGIN MMM:=M-MEM[CUREDGES+3].HH.LH;
IF MMM<GFMINX THEN GFMINX:=MMM;
IF PREVN=4096 THEN BEGIN IF N>GFMAXY THEN GFMAXY:=N;
GFFOUR(MEM[CUREDGES+2].HH.LH-4096);GFFOUR(MEM[CUREDGES+2].HH.RH-4097);
GFFOUR(MEM[CUREDGES+1].HH.LH-4096);GFFOUR(N);GFFOUR(MMM);
END ELSE IF PREVN>N+1 THEN{1094:}BEGIN DELTA:=PREVN-N-1;
IF M<>Z THEN BEGIN GFNEWROW(M-Z);DELTA:=DELTA-1;END;
IF DELTA<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=69;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=DELTA;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=70;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(DELTA);END;END{:1094}
ELSE GFNEWROW(M-Z);Z:=M;PREVN:=N;END{:1093}ELSE GFPAINT(M-PREVM);
PREVM:=M;PREVW:=W;END{:1091};END ELSE IF W<=0 THEN{1092:}
BEGIN GFPAINT(M-PREVM);PREVM:=M;PREVW:=W;END{:1092};M:=MM;END;W:=WW;
Q:=MEM[Q].HH.RH;UNTIL MM=268435456;IF W<>0 THEN PRINTNL(894);
IF PREVM-MEM[CUREDGES+3].HH.LH>GFMAXX THEN GFMAXX:=PREVM-MEM[CUREDGES+3]
.HH.LH{:1090};P:=MEM[P].HH.LH;N:=N-1;END;
IF PREVN=4096 THEN FOR N:=1 TO 20 DO BEGIN GFBUF[GFPTR]:=0;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF PREVN<GFMINY THEN GFMINY:=PREVN{:1089};
BEGIN GFBUF[GFPTR]:=68;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFPREVPTR:=GFOFFSET+GFPTR;TOTALCHARS:=TOTALCHARS+1;
IF INTERNAL[9]>0 THEN PRINTEDGES(CUREDGES,893);END;{:1088}{928:}{940:}
PROCEDURE TRYEQ(L,R:HALFWORD);LABEL 30,31;VAR P:HALFWORD;T:16..18;
Q:HALFWORD;PP:HALFWORD;TT:17..18;BEGIN{941:}T:=MEM[L].HH.B0;
IF T=16 THEN BEGIN T:=17;P:=CONSTDEPENDE(-MEM[L+1].INT);Q:=P;
END ELSE BEGIN P:=MEM[L+1].HH.RH;Q:=P;
WHILE TRUE DO BEGIN MEM[Q+1].INT:=-MEM[Q+1].INT;
IF MEM[Q].HH.LH=0 THEN GOTO 30;Q:=MEM[Q].HH.RH;END;
30:MEM[MEM[L+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[L+1].HH.LH;MEM[L].HH.B0:=16;END{:941};
{943:}
IF R=0 THEN IF CURTYPE=16 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+CUREXP;
GOTO 31;END ELSE BEGIN PP:=MEM[CUREXP+1].HH.RH;TT:=CURTYPE;
END ELSE IF MEM[R].HH.B0=16 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+MEM[R
+1].INT;GOTO 31;END ELSE BEGIN PP:=MEM[R+1].HH.RH;TT:=MEM[R].HH.B0;END;
WATCHCOEFS:=FALSE;
IF T=TT THEN P:=PPLUSQ(P,PP,T)ELSE IF T=18 THEN P:=PPLUSFQ(P,65536,PP,18
)ELSE BEGIN Q:=P;
WHILE MEM[Q].HH.LH<>0 DO BEGIN MEM[Q+1].INT:=ROUNDFRACTIO(MEM[Q+1].INT);
Q:=MEM[Q].HH.RH;END;T:=18;P:=PPLUSQ(P,PP,T);END;WATCHCOEFS:=TRUE;
31:{:943};IF MEM[P].HH.LH=0 THEN{942:}
BEGIN IF MEM[P+1].INT<>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(746);END;PRINT(748);
PRINTSCALED(MEM[P+1].INT);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=747;HELPLINE[0]:=745;END;ERROR;END ELSE IF R=0 THEN{571:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(438);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=439;HELPLINE[0]:=440;END;ERROR;
END{:571};FREENODE(P,2);END{:942}ELSE BEGIN LINEAREQ(P,T);
IF R=0 THEN IF CURTYPE<>16 THEN IF MEM[CUREXP].HH.B0=16 THEN BEGIN PP:=
CUREXP;CUREXP:=MEM[CUREXP+1].INT;CURTYPE:=16;FREENODE(PP,2);END;END;END;
{:940}{934:}PROCEDURE MAKEEQ(LHS:HALFWORD);LABEL 20,10,45;
VAR T:SMALLNUMBER;V:INTEGER;P,Q:HALFWORD;BEGIN 20:T:=MEM[LHS].HH.B0;
IF T<=15 THEN V:=MEM[LHS+1].INT;CASE T OF{936:}
2,4,6,9,11:IF CURTYPE=T+1 THEN BEGIN NONLINEAREQ(V,CUREXP,FALSE);
GOTO 10;END ELSE IF CURTYPE=T THEN{937:}
BEGIN IF CURTYPE<=4 THEN BEGIN IF CURTYPE=4 THEN BEGIN IF STRVSSTR(V,
CUREXP)<>0 THEN GOTO 45;END ELSE IF V<>CUREXP THEN GOTO 45;{571:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(438);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=439;HELPLINE[0]:=440;END;ERROR;
END{:571};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(743);END;BEGIN HELPPTR:=2;HELPLINE[1]:=744;
HELPLINE[0]:=745;END;ERROR;GOTO 10;
45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(746);END;
BEGIN HELPPTR:=2;HELPLINE[1]:=747;HELPLINE[0]:=745;END;ERROR;GOTO 10;
END{:937};
3,5,7,10,12:IF CURTYPE=T-1 THEN BEGIN NONLINEAREQ(CUREXP,LHS,TRUE);
GOTO 10;END ELSE IF CURTYPE=T THEN BEGIN RINGMERGE(LHS,CUREXP);GOTO 10;
END ELSE IF CURTYPE=15 THEN IF T=12 THEN BEGIN PAIRTOPATH;GOTO 20;END;
14,15:IF CURTYPE=T THEN{939:}BEGIN P:=V+BIGNODESIZE[T];
Q:=MEM[CUREXP+1].INT+BIGNODESIZE[T];REPEAT P:=P-2;Q:=Q-2;TRYEQ(P,Q);
UNTIL P=V;GOTO 10;END{:939}
ELSE IF((CURTYPE=12)OR(CURTYPE=11))THEN IF T=15 THEN{938:}
BEGIN P:=STASHCUREXP;UNSTASHCUREX(LHS);PAIRTOPATH;LHS:=STASHCUREXP;
UNSTASHCUREX(P);GOTO 20;END{:938};
16,17,18:IF CURTYPE>=16 THEN BEGIN TRYEQ(LHS,0);GOTO 10;END;1:;{:936}
END;{935:}DISPERR(LHS,312);DISPERR(0,740);
IF MEM[LHS].HH.B0<=15 THEN PRINTTYPE(MEM[LHS].HH.B0)ELSE PRINT(215);
PRINTCHAR(61);IF CURTYPE<=15 THEN PRINTTYPE(CURTYPE)ELSE PRINT(215);
PRINTCHAR(41);BEGIN HELPPTR:=2;HELPLINE[1]:=741;HELPLINE[0]:=742;END;
ERROR{:935};10:BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:934}
PROCEDURE DOASSIGNMENT;FORWARD;PROCEDURE DOEQUATION;VAR LHS:HALFWORD;
BEGIN LHS:=STASHCUREXP;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{930:}BEGIN BEGINDIAGNOS;PRINTNL(697);
PRINTEXP(LHS,0);PRINT(735);PRINTEXP(0,0);PRINT(689);ENDDIAGNOSTI(FALSE);
END{:930};MAKEEQ(LHS);RECYCLEVALUE(LHS);FREENODE(LHS,2);END;{:928}{929:}
PROCEDURE DOASSIGNMENT;VAR LHS:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURTYPE<>21 THEN BEGIN DISPERR(0,732);BEGIN HELPPTR:=2;
HELPLINE[1]:=733;HELPLINE[0]:=734;END;ERROR;DOEQUATION;
END ELSE BEGIN LHS:=CUREXP;CURTYPE:=1;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{931:}BEGIN BEGINDIAGNOS;PRINTNL(123);
IF MEM[LHS].HH.LH>2243 THEN PRINT(INTNAME[MEM[LHS].HH.LH-(2243)])ELSE
SHOWTOKENLIS(LHS,0,1000);PRINT(323);PRINTEXP(0,0);PRINTCHAR(125);
ENDDIAGNOSTI(FALSE);END{:931};IF MEM[LHS].HH.LH>2243 THEN{932:}
IF CURTYPE=16 THEN INTERNAL[MEM[LHS].HH.LH-(2243)]:=CUREXP ELSE BEGIN
DISPERR(0,736);PRINT(INTNAME[MEM[LHS].HH.LH-(2243)]);PRINT(737);
BEGIN HELPPTR:=2;HELPLINE[1]:=738;HELPLINE[0]:=739;END;ERROR;END{:932}
ELSE{933:}BEGIN P:=FINDVARIABLE(LHS);IF P<>0 THEN BEGIN Q:=STASHCUREXP;
CURTYPE:=UNDTYPE(P);RECYCLEVALUE(P);MEM[P].HH.B0:=CURTYPE;
MEM[P+1].INT:=0;MAKEEXPCOPY(P);P:=STASHCUREXP;UNSTASHCUREX(Q);MAKEEQ(P);
END ELSE BEGIN OBLITERATED(LHS);ERROR;END;END{:933};FLUSHNODELIS(LHS);
END;END;{:929}{948:}PROCEDURE DOTYPEDECLAR;VAR T:SMALLNUMBER;P:HALFWORD;
Q:HALFWORD;BEGIN IF CURMOD>=14 THEN T:=CURMOD ELSE T:=CURMOD+1;
REPEAT P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,FALSE);
Q:=FINDVARIABLE(P);MEM[Q].HH.B0:=T;MEM[Q+1].INT:=0;FLUSHLIST(P);
IF CURCMD<78 THEN{949:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(749);END;BEGIN HELPPTR:=5;HELPLINE[4]:=750;
HELPLINE[3]:=751;HELPLINE[2]:=752;HELPLINE[1]:=753;HELPLINE[0]:=754;END;
IF CURCMD=41 THEN HELPLINE[2]:=755;ERROR;SCANNERSTATU:=2;REPEAT GETNEXT;
{689:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:689}
;UNTIL CURCMD>=78;SCANNERSTATU:=0;END{:949};UNTIL CURCMD>78;END;{:948}
{954:}PROCEDURE DORANDOMSEED;BEGIN GETXNEXT;
IF CURCMD<>76 THEN BEGIN MISSINGERR(323);BEGIN HELPPTR:=1;
HELPLINE[0]:=760;END;BACKERROR;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BEGIN DISPERR(0,761);BEGIN HELPPTR:=2;
HELPLINE[1]:=762;HELPLINE[0]:=763;END;FLUSHERROR(0);
END ELSE INITRANDOMS(CUREXP);END;{:954}{961:}PROCEDURE DOPROTECTION;
VAR M:0..1;T:HALFWORD;BEGIN M:=CURMOD;REPEAT GETSYMBOL;
T:=EQTB[CURSYM].LH;
IF M=0 THEN BEGIN IF T>=82 THEN EQTB[CURSYM].LH:=T-82;
END ELSE IF T<82 THEN EQTB[CURSYM].LH:=T+82;GETNEXT;UNTIL CURCMD<>78;
END;{:961}{963:}PROCEDURE DEFDELIMS;VAR LDELIM,RDELIM:HALFWORD;
BEGIN GETCLEARSYMB;LDELIM:=CURSYM;GETCLEARSYMB;RDELIM:=CURSYM;
EQTB[LDELIM].LH:=30;EQTB[LDELIM].RH:=RDELIM;EQTB[RDELIM].LH:=62;
EQTB[RDELIM].RH:=LDELIM;GETNEXT;END;{:963}{966:}PROCEDURE DOSTATEMENT;
FORWARD;PROCEDURE DOINTERIM;BEGIN GETNEXT;
IF CURCMD<>37 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(769);END;PRINTCMDMOD(CURCMD,CURMOD);PRINT(774);
BEGIN HELPPTR:=1;HELPLINE[0]:=775;END;BACKERROR;
END ELSE BEGIN SAVEINTERNAL(CURMOD);BACKINPUT;END;DOSTATEMENT;END;{:966}
{967:}PROCEDURE DOLET;VAR L:HALFWORD;BEGIN GETSYMBOL;L:=CURSYM;GETNEXT;
IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=3;
HELPLINE[2]:=776;HELPLINE[1]:=517;HELPLINE[0]:=777;END;BACKERROR;END;
GETSYMBOL;
CASE CURCMD OF 8,53,43,48:MEM[CURMOD].HH.LH:=MEM[CURMOD].HH.LH+1;
OTHERS:END;CLEARSYMBOL(L,FALSE);EQTB[L].LH:=CURCMD;
IF CURCMD=39 THEN EQTB[L].RH:=0 ELSE EQTB[L].RH:=CURMOD;GETNEXT;END;
{:967}{968:}PROCEDURE DONEWINTERNA;
BEGIN REPEAT IF INTPTR=MAXINTERNAL THEN OVERFLOW(778,MAXINTERNAL);
GETCLEARSYMB;INTPTR:=INTPTR+1;EQTB[CURSYM].LH:=37;
EQTB[CURSYM].RH:=INTPTR;INTNAME[INTPTR]:=HASH[CURSYM].RH;
INTERNAL[INTPTR]:=0;GETNEXT;UNTIL CURCMD<>78;END;{:968}{972:}
PROCEDURE DOSHOW;VAR VERBOSITY:SMALLNUMBER;BEGIN VERBOSITY:=CURMOD-1;
REPEAT GETXNEXT;SCANEXPRESSI;PRINTNL(615);PRINTEXP(0,VERBOSITY);
FLUSHCUREXP(0);UNTIL CURCMD<>78;END;{:972}{973:}PROCEDURE DISPTOKEN;
BEGIN PRINTNL(788);IF CURSYM=0 THEN{974:}
BEGIN IF CURCMD=41 THEN PRINTSCALED(CURMOD)ELSE BEGIN PRINTCHAR(34);
PRINT(CURMOD);PRINTCHAR(34);
BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1 THEN STRREF[CURMOD]
:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END;END;END{:974}
ELSE IF CURSYM>2243 THEN PRINT(789)ELSE BEGIN PRINT(HASH[CURSYM].RH);
PRINTCHAR(61);IF EQTB[CURSYM].LH>=82 THEN PRINT(790);
PRINTCMDMOD(CURCMD,CURMOD);IF CURCMD=8 THEN BEGIN PRINTLN;
SHOWMACRO(CURMOD,0,1000);END;END;END;{:973}{976:}PROCEDURE DOSHOWTOKEN;
BEGIN REPEAT GETNEXT;DISPTOKEN;GETNEXT;UNTIL CURCMD<>78;END;{:976}{977:}
PROCEDURE DOSHOWSTATS;BEGIN PRINTNL(799);PRINTINT(VARUSED);
PRINTCHAR(38);PRINTINT(DYNUSED);PRINT(800);PRINTINT(MAXVARUSED);
PRINTCHAR(38);PRINTINT(MEMEND-25999);PRINTCHAR(41);
IF FALSE THEN PRINT(801);PRINT(802);PRINTINT(STRPTR);PRINTCHAR(38);
PRINTINT(POOLPTR);GETNEXT;END;{:977}{978:}PROCEDURE DISPVAR(P:HALFWORD);
VAR Q:HALFWORD;N:0..MAXPRINTLINE;BEGIN IF MEM[P].HH.B0=22 THEN{979:}
BEGIN Q:=MEM[P+1].HH.LH;REPEAT DISPVAR(Q);Q:=MEM[Q].HH.RH;UNTIL Q=17;
Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.B1=3 DO BEGIN DISPVAR(Q);
Q:=MEM[Q].HH.RH;END;END{:979}ELSE IF MEM[P].HH.B0>=23 THEN{980:}
BEGIN PRINTNL(312);PRINTVARIABL(P);IF MEM[P].HH.B0>23 THEN PRINT(510);
PRINT(803);
IF FILEOFFSET>=MAXPRINTLINE-20 THEN N:=5 ELSE N:=MAXPRINTLINE-FILEOFFSET
-15;SHOWMACRO(MEM[P+1].INT,0,N);END{:980}
ELSE IF MEM[P].HH.B0<>0 THEN BEGIN PRINTNL(312);PRINTVARIABL(P);
PRINTCHAR(61);PRINTEXP(P,0);END;END;{:978}{981:}PROCEDURE DOSHOWVAR;
LABEL 30;BEGIN REPEAT GETNEXT;
IF CURSYM>0 THEN IF CURSYM<=2243 THEN IF CURCMD=39 THEN IF CURMOD<>0
THEN BEGIN DISPVAR(CURMOD);GOTO 30;END;DISPTOKEN;30:GETNEXT;
UNTIL CURCMD<>78;END;{:981}{982:}PROCEDURE DOSHOWDEPEND(M:SMALLNUMBER);
VAR P:HALFWORD;BEGIN P:=MEM[13].HH.RH;
WHILE P<>13 DO BEGIN IF(MEM[P].HH.B1<>11)OR(M=6)THEN BEGIN PRINTNL(312);
PRINTVARIABL(P);IF MEM[P].HH.B0=17 THEN PRINTCHAR(61)ELSE PRINT(804);
PRINTDEPENDE(MEM[P+1].HH.RH,MEM[P].HH.B0);END;P:=MEM[P+1].HH.RH;
WHILE MEM[P].HH.LH<>0 DO P:=MEM[P].HH.RH;P:=MEM[P].HH.RH;END;GETNEXT;
END;{:982}{985:}PROCEDURE FINDEDGESVAR(T:HALFWORD);VAR P:HALFWORD;
BEGIN P:=FINDVARIABLE(T);CUREDGES:=0;IF P=0 THEN BEGIN OBLITERATED(T);
ERROR;END ELSE IF MEM[P].HH.B0<>9 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(441);END;SHOWTOKENLIS(T,0,1000);
PRINT(810);PRINTTYPE(MEM[P].HH.B0);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=811;HELPLINE[0]:=812;END;ERROR;
END ELSE CUREDGES:=MEM[P+1].INT;FLUSHNODELIS(T);END;{:985}{987:}
PROCEDURE DOADDTO;LABEL 30;VAR LHS,RHS:HALFWORD;M:SMALLNUMBER;
T:SMALLNUMBER;W,WW:INTEGER;PEN:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN GETXNEXT;VARFLAG:=66;SCANPRIMARY;IF CURTYPE<>21 THEN{988:}
BEGIN DISPERR(0,813);BEGIN HELPPTR:=4;HELPLINE[3]:=814;HELPLINE[2]:=815;
HELPLINE[1]:=816;HELPLINE[0]:=812;END;FLUSHERROR(0);END{:988}
ELSE BEGIN LHS:=CUREXP;M:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF M=2 THEN{989:}BEGIN FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN FLUSHCUREXP(0)ELSE IF CURTYPE<>9 THEN BEGIN DISPERR(0
,817);BEGIN HELPPTR:=2;HELPLINE[1]:=818;HELPLINE[0]:=812;END;
FLUSHERROR(0);END ELSE BEGIN MERGEEDGES(CUREXP);FLUSHCUREXP(0);END;
END{:989}ELSE{990:}BEGIN IF CURTYPE=15 THEN PAIRTOPATH;
IF CURTYPE<>11 THEN BEGIN DISPERR(0,817);BEGIN HELPPTR:=2;
HELPLINE[1]:=819;HELPLINE[0]:=812;END;FLUSHERROR(0);
END ELSE BEGIN RHS:=CUREXP;W:=1;PEN:=3;
WHILE CURCMD=65 DO BEGIN T:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>T THEN{991:}BEGIN DISPERR(0,820);BEGIN HELPPTR:=2;
HELPLINE[1]:=821;HELPLINE[0]:=822;END;IF T=6 THEN HELPLINE[1]:=823;
FLUSHERROR(0);END{:991}ELSE IF T=16 THEN{992:}
BEGIN WW:=ROUNDUNSCALE(CUREXP);
IF(ABS(WW)<4)AND(WW<>0)THEN W:=WW ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(824);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=822;END;FLUSHERROR(0);END;END{:992}ELSE{993:}
BEGIN IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN]
.HH.LH-1;PEN:=CUREXP;END{:993};END;{994:}FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN TOSSKNOTLIST(RHS)ELSE BEGIN IF M=1 THEN{995:}
BEGIN IF MEM[RHS].HH.B0<>0 THEN{996:}BEGIN P:=GETNODE(7);
MEM[P].HH.RH:=MEM[RHS].HH.RH;MEM[RHS].HH.RH:=P;
MEM[P+1].INT:=MEM[RHS+1].INT;MEM[P+2].INT:=MEM[RHS+2].INT;
MEM[P+5].INT:=MEM[RHS+5].INT;MEM[P+6].INT:=MEM[RHS+6].INT;
MEM[P+3].INT:=0;MEM[P+4].INT:=0;MEM[P].HH.B0:=0;
MEM[P].HH.B1:=MEM[RHS].HH.B1;MEM[RHS].HH.B1:=0;RHS:=P;END{:996};
IF MEM[RHS].HH.RH=RHS THEN{997:}BEGIN MEM[RHS+5].INT:=MEM[RHS+1].INT;
MEM[RHS+6].INT:=MEM[RHS+2].INT;MEM[RHS+3].INT:=MEM[RHS+1].INT;
MEM[RHS+4].INT:=MEM[RHS+2].INT;MEM[RHS].HH.B0:=1;MEM[RHS].HH.B1:=1;
END{:997}ELSE BEGIN P:=HTAPYPOC(RHS);Q:=MEM[P].HH.RH;
MEM[PATHTAIL+5].INT:=MEM[Q+5].INT;MEM[PATHTAIL+6].INT:=MEM[Q+6].INT;
MEM[PATHTAIL].HH.B1:=MEM[Q].HH.B1;MEM[PATHTAIL].HH.RH:=MEM[Q].HH.RH;
FREENODE(Q,7);MEM[P+5].INT:=MEM[RHS+5].INT;MEM[P+6].INT:=MEM[RHS+6].INT;
MEM[P].HH.B1:=MEM[RHS].HH.B1;MEM[P].HH.RH:=MEM[RHS].HH.RH;
FREENODE(RHS,7);RHS:=P;END;END{:995};IF MEM[RHS].HH.B0=0 THEN{998:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(825);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=826;HELPLINE[0]:=812;END;ERROR;
TOSSKNOTLIST(RHS);END{:998}ELSE BEGIN CURWT:=W;
RHS:=MAKESPEC(RHS,MEM[PEN+9].INT);{999:}
IF WINDINGNUMBE<=0 THEN IF INTERNAL[31]>0 THEN IF(WINDINGNUMBE<0)AND(PEN
=3)THEN CURWT:=-CURWT ELSE BEGIN IF WINDINGNUMBE=0 THEN IF(INTERNAL[31]
<=65536)AND(PEN=3)THEN GOTO 30 ELSE BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(827);
END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(828);END;BEGIN HELPPTR:=2;HELPLINE[1]:=829;HELPLINE[0]:=830;END;
ERROR;END;30:{:999};
IF PEN=3 THEN FILLSPEC(RHS)ELSE FILLENVELOPE(RHS,PEN);END;END{:994};
IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN].HH.LH
-1;END;END{:990};END;END;{:987}{1001:}{1025:}
FUNCTION TFMCHECK(M:SMALLNUMBER):SCALED;
BEGIN IF ABS(INTERNAL[M])>=134217728 THEN BEGIN BEGIN IF INTERACTION=3
THEN WAKEUPTERMIN;PRINTNL(133);PRINT(848);END;PRINT(INTNAME[M]);
PRINT(849);BEGIN HELPPTR:=1;HELPLINE[0]:=850;END;ERROR;
IF INTERNAL[M]>0 THEN TFMCHECK:=134217727 ELSE TFMCHECK:=-134217727;
END ELSE TFMCHECK:=INTERNAL[M];END;{:1025}PROCEDURE DOSHIPOUT;LABEL 10;
VAR C:INTEGER;BEGIN GETXNEXT;VARFLAG:=79;SCANEXPRESSI;
IF CURTYPE<>21 THEN IF CURTYPE=9 THEN CUREDGES:=CUREXP ELSE BEGIN{988:}
BEGIN DISPERR(0,813);BEGIN HELPPTR:=4;HELPLINE[3]:=814;HELPLINE[2]:=815;
HELPLINE[1]:=816;HELPLINE[0]:=812;END;FLUSHERROR(0);END{:988};GOTO 10;
END ELSE BEGIN FINDEDGESVAR(CUREXP);CURTYPE:=1;END;
IF CUREDGES<>0 THEN BEGIN C:=ROUNDUNSCALE(INTERNAL[16])MOD 256;
IF C<0 THEN C:=C+256;{1026:}IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
CHAREXISTS[C]:=TRUE;GFWIDTH[C]:=ROUNDUNSCALE(INTERNAL[22]);
TFMWIDTH[C]:=TFMCHECK(18);TFMHEIGHT[C]:=TFMCHECK(19);
TFMDEPTH[C]:=TFMCHECK(20);TFMITALCORR[C]:=TFMCHECK(21){:1026};
IF INTERNAL[28]>=0 THEN SHIPOUT(C);END;FLUSHCUREXP(0);10:END;{:1001}
{1002:}PROCEDURE DODISPLAY;LABEL 45,50,10;VAR E:HALFWORD;BEGIN GETXNEXT;
VARFLAG:=71;SCANPRIMARY;IF CURTYPE<>21 THEN{988:}BEGIN DISPERR(0,813);
BEGIN HELPPTR:=4;HELPLINE[3]:=814;HELPLINE[2]:=815;HELPLINE[1]:=816;
HELPLINE[0]:=812;END;FLUSHERROR(0);END{:988}ELSE BEGIN E:=CUREXP;
CURTYPE:=1;GETXNEXT;SCANEXPRESSI;IF CURTYPE<>16 THEN GOTO 50;
CUREXP:=ROUNDUNSCALE(CUREXP);IF CUREXP<0 THEN GOTO 45;
IF CUREXP>15 THEN GOTO 45;IF NOT WINDOWOPEN[CUREXP]THEN GOTO 45;
FINDEDGESVAR(E);IF CUREDGES<>0 THEN DISPEDGES(CUREXP);GOTO 10;
45:CUREXP:=CUREXP*65536;50:DISPERR(0,831);BEGIN HELPPTR:=1;
HELPLINE[0]:=832;END;FLUSHERROR(0);END;10:END;{:1002}{1003:}
FUNCTION GETPAIR(C:COMMANDCODE):BOOLEAN;VAR P:HALFWORD;B:BOOLEAN;
BEGIN IF CURCMD<>C THEN GETPAIR:=FALSE ELSE BEGIN GETXNEXT;SCANEXPRESSI;
IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
CURX:=MEM[P+1].INT;CURY:=MEM[P+3].INT;B:=TRUE;END ELSE B:=FALSE;
FLUSHCUREXP(0);GETPAIR:=B;END;END;{:1003}{1004:}PROCEDURE DOOPENWINDOW;
LABEL 45,10;VAR K:INTEGER;R0,C0,R1,C1:SCALED;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN GOTO 45;K:=ROUNDUNSCALE(CUREXP);
IF K<0 THEN GOTO 45;IF K>15 THEN GOTO 45;IF NOT GETPAIR(68)THEN GOTO 45;
R0:=CURX;C0:=CURY;IF NOT GETPAIR(69)THEN GOTO 45;R1:=CURX;C1:=CURY;
IF NOT GETPAIR(70)THEN GOTO 45;OPENAWINDOW(K,R0,C0,R1,C1,CURX,CURY);
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(833);END;BEGIN HELPPTR:=2;HELPLINE[1]:=834;HELPLINE[0]:=835;END;
ERROR;10:END;{:1004}{1005:}PROCEDURE DOCULL;LABEL 45,10;VAR E:HALFWORD;
BEGIN GETXNEXT;VARFLAG:=72;SCANPRIMARY;IF CURTYPE<>21 THEN{988:}
BEGIN DISPERR(0,813);BEGIN HELPPTR:=4;HELPLINE[3]:=814;HELPLINE[2]:=815;
HELPLINE[1]:=816;HELPLINE[0]:=812;END;FLUSHERROR(0);END{:988}
ELSE BEGIN E:=CUREXP;CURTYPE:=1;IF NOT GETPAIR(72)THEN GOTO 45;
FINDEDGESVAR(E);
IF CUREDGES<>0 THEN CULLEDGES(ROUNDUNSCALE(CURY),ROUNDUNSCALE(CURX));
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(836);END;BEGIN HELPPTR:=1;HELPLINE[0]:=837;END;ERROR;END;10:END;
{:1005}{1009:}PROCEDURE DOMESSAGE;VAR M:0..2;BEGIN M:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>4 THEN BEGIN DISPERR(0,841);BEGIN HELPPTR:=1;
HELPLINE[0]:=842;END;ERROR;END ELSE CASE M OF 0:PRINTNL(CUREXP);
1:{1013:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(CUREXP);END;
IF ERRHELP<>0 THEN USEERRHELP:=TRUE ELSE IF LONGHELPSEEN THEN BEGIN
HELPPTR:=1;HELPLINE[0]:=843;
END ELSE BEGIN IF INTERACTION<3 THEN LONGHELPSEEN:=TRUE;
BEGIN HELPPTR:=4;HELPLINE[3]:=844;HELPLINE[2]:=845;HELPLINE[1]:=846;
HELPLINE[0]:=847;END;END;ERROR;USEERRHELP:=FALSE;END{:1013};2:{1010:}
BEGIN IF ERRHELP<>0 THEN BEGIN IF STRREF[ERRHELP]<127 THEN IF STRREF[
ERRHELP]>1 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]-1 ELSE FLUSHSTRING(
ERRHELP);END;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN ERRHELP:=0 ELSE BEGIN
ERRHELP:=CUREXP;
BEGIN IF STRREF[ERRHELP]<127 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]+1;
END;END;END{:1010};END;FLUSHCUREXP(0);END;{:1009}{1030:}
FUNCTION GETCODE:EIGHTBITS;LABEL 40;VAR C:INTEGER;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE=16 THEN BEGIN C:=ROUNDUNSCALE(CUREXP);
IF C>=0 THEN IF C<256 THEN GOTO 40;
END ELSE IF CURTYPE=4 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=1
THEN BEGIN C:=STRPOOL[STRSTART[CUREXP]];GOTO 40;END;DISPERR(0,856);
BEGIN HELPPTR:=2;HELPLINE[1]:=857;HELPLINE[0]:=858;END;FLUSHERROR(0);
C:=0;40:GETCODE:=C;END;{:1030}{1031:}PROCEDURE SETTAG(C:EIGHTBITS;
T:SMALLNUMBER;R:EIGHTBITS);
BEGIN IF CHARTAG[C]=0 THEN BEGIN CHARTAG[C]:=T;CHARREMAINDE[C]:=R;
END ELSE{1032:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(859);END;
IF(C>32)AND(C<128)THEN PRINT(C)ELSE BEGIN PRINT(860);PRINTINT(C);END;
PRINT(861);CASE CHARTAG[C]OF 1:PRINT(862);2:PRINT(863);3:PRINT(853);END;
BEGIN HELPPTR:=4;HELPLINE[3]:=864;HELPLINE[2]:=865;HELPLINE[1]:=866;
HELPLINE[0]:=867;END;ERROR;END{:1032};END;{:1031}{1033:}
PROCEDURE DOTFMCOMMAND;LABEL 22;VAR C,CC:EIGHTBITS;K:0..256;J:INTEGER;
BEGIN CASE CURMOD OF 0:{1034:}BEGIN C:=GETCODE;
WHILE CURCMD=78 DO BEGIN CC:=GETCODE;SETTAG(C,2,CC);C:=CC;END;END{:1034}
;1:{1035:}BEGIN 22:C:=GETCODE;IF CURCMD=77 THEN{1038:}
BEGIN IF NL>255 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(877);END;BEGIN HELPPTR:=1;HELPLINE[0]:=878;END;ERROR;
END ELSE SETTAG(C,1,NL);GOTO 22;END{:1038};
IF CURCMD=75 THEN BEGIN{1039:}LIGKERN[NL].B1:=C;LIGKERN[NL].B2:=CURMOD;
IF CURMOD=0 THEN LIGKERN[NL].B3:=GETCODE ELSE BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>16 THEN BEGIN DISPERR(0,879);BEGIN HELPPTR:=2;
HELPLINE[1]:=880;HELPLINE[0]:=180;END;FLUSHERROR(0);END;
KERN[NK]:=CUREXP;K:=0;WHILE KERN[K]<>CUREXP DO K:=K+1;
IF K=NK THEN BEGIN IF NK=256 THEN OVERFLOW(876,256);NK:=NK+1;END;
LIGKERN[NL].B3:=K;END{:1039};
IF NL=LIGTABLESIZE THEN OVERFLOW(872,LIGTABLESIZE);NL:=NL+1;
IF CURCMD=78 THEN GOTO 22;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(873);END;BEGIN HELPPTR:=1;HELPLINE[0]:=874;END;BACKERROR;END;
IF NL>0 THEN LIGKERN[NL-1].B0:=128;END{:1035};2:{1040:}
BEGIN IF NE=256 THEN OVERFLOW(853,256);C:=GETCODE;SETTAG(C,3,NE);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=881;END;BACKERROR;END;EXTEN[NE].B0:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=881;END;BACKERROR;END;EXTEN[NE].B1:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=881;END;BACKERROR;END;EXTEN[NE].B2:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=881;END;BACKERROR;END;EXTEN[NE].B3:=GETCODE;NE:=NE+1;
END{:1040};3,4:BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>16)OR(CUREXP<32768)THEN BEGIN DISPERR(0,868);
BEGIN HELPPTR:=2;HELPLINE[1]:=869;HELPLINE[0]:=870;END;ERROR;
END ELSE BEGIN J:=ROUNDUNSCALE(CUREXP);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=871;END;BACKERROR;END;IF C=3 THEN{1041:}
REPEAT IF J>HEADERSIZE THEN OVERFLOW(854,HEADERSIZE);
HEADERBYTE[J]:=GETCODE;J:=J+1;UNTIL CURCMD<>78{:1041}ELSE{1042:}
REPEAT IF J>MAXFONTDIMEN THEN OVERFLOW(855,MAXFONTDIMEN);
WHILE J>NP DO BEGIN NP:=NP+1;PARAM[NP]:=0;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BEGIN DISPERR(0,882);BEGIN HELPPTR:=1;
HELPLINE[0]:=180;END;FLUSHERROR(0);END;PARAM[J]:=CUREXP;J:=J+1;
UNTIL CURCMD<>78{:1042};END;END;END;END;{:1033}{1097:}
PROCEDURE DOSPECIAL;VAR M:SMALLNUMBER;BEGIN M:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF INTERNAL[28]>=0 THEN IF CURTYPE<>M THEN{1098:}
BEGIN DISPERR(0,897);BEGIN HELPPTR:=1;HELPLINE[0]:=898;END;ERROR;
END{:1098}ELSE BEGIN IF OUTPUTFILENA=0 THEN INITGF;IF M=4 THEN{1100:}
BEGIN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=255 THEN BEGIN BEGIN
GFBUF[GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP]));END;GFSTRING(CUREXP);
END{:1100}ELSE{1099:}BEGIN BEGIN GFBUF[GFPTR]:=245;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(CUREXP);END{:1099};END;
FLUSHCUREXP(0);END;{:1097}{1108:}PROCEDURE STOREBASEFIL;
VAR J,K,L:INTEGER;P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1110:}
IF SAVEPTR<>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(906);END;BEGIN HELPPTR:=1;HELPLINE[0]:=907;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END{:1110};
{1123:}SELECTOR:=5;PRINT(911);PRINT(JOBNAME);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12])MOD 100);PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(41);
IF INTERACTION=0 THEN SELECTOR:=2 ELSE SELECTOR:=3;
BEGIN IF POOLPTR+1>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);END;
BASEIDENT:=MAKESTRING;STRREF[BASEIDENT]:=127;PACKJOBNAME(912);
WHILE NOT WOPENOUT(BASEFILE)DO PROMPTFILENA(913,912);PRINTNL(914);
PRINT(WMAKENAMESTR(BASEFILE));FLUSHSTRING(STRPTR-1);
PRINTNL(BASEIDENT){:1123};{1113:}BEGIN BASEFILE↑.INT:=125221776;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=26000;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=2100;PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=1777;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=6;PUT(BASEFILE);END{:1113};
{1115:}BEGIN BASEFILE↑.INT:=POOLPTR;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=STRPTR;PUT(BASEFILE);END;
FOR K:=0 TO STRPTR DO BEGIN BASEFILE↑.INT:=STRSTART[K];PUT(BASEFILE);
END;K:=0;WHILE K+4<POOLPTR DO BEGIN W.B0:=STRPOOL[K];W.B1:=STRPOOL[K+1];
W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];BEGIN BASEFILE↑.QQQQ:=W;
PUT(BASEFILE);END;K:=K+4;END;K:=POOLPTR-4;W.B0:=STRPOOL[K];
W.B1:=STRPOOL[K+1];W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];
BEGIN BASEFILE↑.QQQQ:=W;PUT(BASEFILE);END;PRINTLN;PRINTINT(STRPTR);
PRINT(908);PRINTINT(POOLPTR){:1115};{1117:}SORTAVAIL;VARUSED:=0;
BEGIN BASEFILE↑.INT:=ROVER;PUT(BASEFILE);END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+Q+2-P;VARUSED:=VARUSED+Q-P;P:=Q+MEM[Q].HH.LH;Q:=MEM[Q+1].HH.RH;
UNTIL Q=ROVER;VARUSED:=VARUSED+26000-P;DYNUSED:=MEMEND-25999;
BEGIN BASEFILE↑.INT:=MEMEND;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=AVAIL;PUT(BASEFILE);END;
FOR K:=P TO MEMEND DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+MEMEND+1-P;P:=AVAIL;WHILE P<>0 DO BEGIN DYNUSED:=DYNUSED-1;
P:=MEM[P].HH.RH;END;BEGIN BASEFILE↑.INT:=VARUSED;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=DYNUSED;PUT(BASEFILE);END;PRINTLN;PRINTINT(X);
PRINT(909);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED){:1117};
{1119:}BEGIN BASEFILE↑.INT:=HASHUSED;PUT(BASEFILE);END;
STCOUNT:=2228-HASHUSED;
FOR P:=1 TO HASHUSED DO IF HASH[P].RH<>0 THEN BEGIN BEGIN BASEFILE↑.INT
:=P;PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=HASH[P];PUT(BASEFILE);END;
BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;STCOUNT:=STCOUNT+1;END;
FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN BASEFILE↑.HH:=HASH[P];
PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STCOUNT;PUT(BASEFILE);END;PRINTLN;
PRINTINT(STCOUNT);PRINT(910){:1119};{1121:}BEGIN BASEFILE↑.INT:=INTPTR;
PUT(BASEFILE);END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN BASEFILE↑.INT:=INTERNAL[K];
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=INTNAME[K];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=INTERACTION;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=BASEIDENT;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=69069;PUT(BASEFILE);END;INTERNAL[10]:=0{:1121};
{1124:}WCLOSE(BASEFILE){:1124};END;{:1108}PROCEDURE DOSTATEMENT;
BEGIN CURTYPE:=1;GETXNEXT;IF CURCMD>42 THEN{923:}
BEGIN IF CURCMD<79 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(718);END;PRINTCMDMOD(CURCMD,CURMOD);PRINTCHAR(39);
BEGIN HELPPTR:=5;HELPLINE[4]:=719;HELPLINE[3]:=720;HELPLINE[2]:=721;
HELPLINE[1]:=722;HELPLINE[0]:=723;END;BACKERROR;GETNEXT;END;END{:923}
ELSE IF CURCMD>29 THEN{926:}BEGIN VARFLAG:=76;SCANEXPRESSI;
IF CURCMD<80 THEN BEGIN IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76
THEN DOASSIGNMENT ELSE IF CURTYPE=4 THEN{927:}
BEGIN IF INTERNAL[1]>0 THEN BEGIN PRINTNL(CUREXP);BREAK(TTY);END;
IF INTERNAL[28]>0 THEN{1101:}BEGIN IF OUTPUTFILENA=0 THEN INITGF;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=249 THEN BEGIN BEGIN GFBUF[
GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])+6;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP])+6);END;GFSTRING(899);
GFSTRING(CUREXP);END{:1101};END{:927}
ELSE IF CURTYPE<>1 THEN BEGIN DISPERR(0,728);BEGIN HELPPTR:=3;
HELPLINE[2]:=729;HELPLINE[1]:=730;HELPLINE[0]:=731;END;BACKERROR;
GETNEXT;END;FLUSHCUREXP(0);CURTYPE:=1;END;END{:926}ELSE{925:}
BEGIN IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
CASE CURCMD OF 29:DOTYPEDECLAR;
14:IF CURMOD>2 THEN MAKEOPDEF ELSE IF CURMOD>0 THEN SCANDEF;15:READTOKS;
{953:}23:DORANDOMSEED;{:953}{955:}22:BEGIN PRINTLN;INTERACTION:=CURMOD;
{69:}IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF JOBNAME<>0 THEN SELECTOR:=SELECTOR+2;GETNEXT;END;{:955}{958:}
20:DOPROTECTION;{:958}{962:}26:DEFDELIMS;{:962}{965:}
10:REPEAT GETSYMBOL;SAVEVARIABLE(CURSYM);GETNEXT;UNTIL CURCMD<>78;
11:DOINTERIM;12:DOLET;13:DONEWINTERNA;{:965}{971:}
21:BEGIN CASE CURMOD OF 0:DOSHOWTOKEN;1:DOSHOWSTATS;2,3:DOSHOW;
4:DOSHOWVAR;5,6:DOSHOWDEPEND(CURMOD);END;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(786);END;
IF INTERACTION<3 THEN BEGIN HELPPTR:=0;ERRORCOUNT:=ERRORCOUNT-1;
END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=787;END;ERROR;END;{:971}{986:}
17:DOADDTO;{:986}{1000:}16:DOSHIPOUT;9:DODISPLAY;27:DOOPENWINDOW;
18:DOCULL;{:1000}{1008:}24:DOMESSAGE;{:1008}{1027:}19:DOTFMCOMMAND;
{:1027}{1095:}28:DOSPECIAL;{:1095}END;CURTYPE:=1;END{:925};
IF CURCMD<79 THEN{924:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(724);END;BEGIN HELPPTR:=6;HELPLINE[5]:=725;
HELPLINE[4]:=726;HELPLINE[3]:=727;HELPLINE[2]:=721;HELPLINE[1]:=722;
HELPLINE[0]:=723;END;BACKERROR;SCANNERSTATU:=2;REPEAT GETNEXT;{689:}
IF CURCMD=40 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:689}
;UNTIL CURCMD>=79;SCANNERSTATU:=0;END{:924};ERRORCOUNT:=0;END;{:922}
{950:}PROCEDURE MAINCONTROL;BEGIN REPEAT DOSTATEMENT;
IF CURCMD=80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(756);END;BEGIN HELPPTR:=2;HELPLINE[1]:=757;
HELPLINE[0]:=535;END;FLUSHERROR(0);END;UNTIL CURCMD=81;END;{:950}{1044:}
FUNCTION SORTIN(V:SCALED):HALFWORD;LABEL 40;VAR P,Q,R:HALFWORD;
BEGIN P:=26001;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF V<=MEM[Q+1].INT THEN GOTO 40;P:=Q;END;
40:IF V<MEM[Q+1].INT THEN BEGIN R:=GETNODE(2);MEM[R+1].INT:=V;
MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;END;SORTIN:=MEM[P].HH.RH;END;{:1044}
{1045:}FUNCTION MINCOVER(D:SCALED):INTEGER;VAR P:HALFWORD;L:SCALED;
M:INTEGER;BEGIN M:=0;P:=MEM[26001].HH.RH;PERTURBATION:=2147483647;
WHILE P<>19 DO BEGIN M:=M+1;L:=MEM[P+1].INT;REPEAT P:=MEM[P].HH.RH;
UNTIL MEM[P+1].INT>L+D;
IF MEM[P+1].INT-L<PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-L;END;
MINCOVER:=M;END;{:1045}{1047:}FUNCTION THRESHOLD(M:INTEGER):SCALED;
VAR D:SCALED;
BEGIN IF MINCOVER(0)<=M THEN THRESHOLD:=0 ELSE BEGIN REPEAT D:=
PERTURBATION;UNTIL MINCOVER(D+D)<=M;
WHILE MINCOVER(D)>M DO D:=PERTURBATION;THRESHOLD:=D;END;END;{:1047}
{1048:}FUNCTION SKIMP(M:INTEGER):INTEGER;VAR D:SCALED;P,Q,R:HALFWORD;
L:SCALED;V:SCALED;BEGIN D:=THRESHOLD(M);PERTURBATION:=0;Q:=26001;M:=0;
P:=MEM[26001].HH.RH;WHILE P<>19 DO BEGIN M:=M+1;L:=MEM[P+1].INT;
MEM[P].HH.LH:=M;IF MEM[MEM[P].HH.RH+1].INT<=L+D THEN{1049:}
BEGIN REPEAT P:=MEM[P].HH.RH;MEM[P].HH.LH:=M;
UNTIL MEM[MEM[P].HH.RH+1].INT>L+D;V:=(L+MEM[P+1].INT)DIV 2;
IF MEM[P+1].INT-V>PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-V;R:=Q;
REPEAT R:=MEM[R].HH.RH;MEM[R+1].INT:=V;UNTIL R=P;MEM[Q].HH.RH:=P;
END{:1049};Q:=P;P:=MEM[P].HH.RH;END;SKIMP:=M;END;{:1048}{1050:}
PROCEDURE TFMWARNING(M:SMALLNUMBER);BEGIN PRINTNL(883);
PRINT(INTNAME[M]);PRINT(884);PRINTSCALED(PERTURBATION);PRINT(885);END;
{:1050}{1055:}PROCEDURE FIXCHECKSUM;VAR K:EIGHTBITS;
B1,B2,B3,B4:EIGHTBITS;X:INTEGER;
BEGIN IF HEADERBYTE[1]<0 THEN IF HEADERBYTE[2]<0 THEN IF HEADERBYTE[3]<0
THEN IF HEADERBYTE[4]<0 THEN BEGIN{1057:}B1:=0;B2:=0;B3:=BC;B4:=EC;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN BEGIN X:=((MEM[TFMWIDTH[K]+1].
INT+8)DIV 16)+K*4194304;IF X<0 THEN X:=X+1073741823;
B1:=(B1+B1+X)MOD 256;B2:=(B2+B2+(X MOD 255))MOD 256;
B3:=(B3+B3+(X MOD 253))MOD 256;B4:=(B4+B4+(X MOD 251))MOD 256;END;
{:1057};HEADERBYTE[1]:=B1;HEADERBYTE[2]:=B2;HEADERBYTE[3]:=B3;
HEADERBYTE[4]:=B4;END;END;{:1055}{1056:}PROCEDURE FIXDESIGNSIZ;
VAR D:SCALED;BEGIN D:=INTERNAL[23];
IF(D<65536)OR(D>=134217728)THEN BEGIN IF D<>0 THEN PRINTNL(886);
D:=8388608;INTERNAL[23]:=D;END;
IF HEADERBYTE[5]<0 THEN IF HEADERBYTE[6]<0 THEN IF HEADERBYTE[7]<0 THEN
IF HEADERBYTE[8]<0 THEN BEGIN HEADERBYTE[5]:=D DIV 1048576;
HEADERBYTE[6]:=(D DIV 4096)MOD 256;HEADERBYTE[7]:=(D DIV 16)MOD 256;
HEADERBYTE[8]:=(D MOD 16)*16;END;MAXTFMDIMEN:=16*INTERNAL[23];
IF MAXTFMDIMEN>=134217728 THEN MAXTFMDIMEN:=134217727;END;{:1056}{1058:}
PROCEDURE TFMTWO(X:INTEGER);BEGIN WRITE(TFMFILE,X DIV 256);
WRITE(TFMFILE,X MOD 256);END;PROCEDURE TFMFOUR(X:INTEGER);
BEGIN IF X>=0 THEN WRITE(TFMFILE,X DIV 16777216)ELSE BEGIN X:=X
+1073741824;X:=X+1073741824;WRITE(TFMFILE,(X DIV 16777216)+128);END;
X:=X MOD 16777216;WRITE(TFMFILE,X DIV 65536);X:=X MOD 65536;
WRITE(TFMFILE,X DIV 256);WRITE(TFMFILE,X MOD 256);END;
PROCEDURE TFMQQQQ(X:FOURQUARTERS);BEGIN WRITE(TFMFILE,X.B0);
WRITE(TFMFILE,X.B1);WRITE(TFMFILE,X.B2);WRITE(TFMFILE,X.B3);END;{:1058}
{1062:}PROCEDURE TFMDIMENOUT(X:SCALED);
BEGIN IF ABS(X)>=MAXTFMDIMEN THEN BEGIN TFMCHANGED:=TFMCHANGED+1;
IF X>0 THEN X:=16777215 ELSE X:=-16777215;
END ELSE X:=MAKESCALED(X*16,INTERNAL[23]);TFMFOUR(X);END;{:1062}{1109:}
{724:}FUNCTION OPENBASEFILE:BOOLEAN;LABEL 40,10;VAR J:0..BUFSIZE;
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=38 THEN BEGIN CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;J:=CURINPUT.LOCFIELD;BUFFER[LAST]:=32;
WHILE BUFFER[J]<>32 DO J:=J+1;PACKBUFFERED(0,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
PACKBUFFERED(9,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
WAKEUPTERMIN;
WRITELN(TTY,'Sorry, I can''t find that base;',' will try PLAIN.');END;
PACKBUFFERED(14,1,0);IF NOT WOPENIN(BASEFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'I can''t find the PLAIN base file!');OPENBASEFILE:=FALSE;
GOTO 10;END;40:OPENBASEFILE:=TRUE;10:END;{:724}
FUNCTION LOADBASEFILE:BOOLEAN;LABEL 6666,10;VAR J,K:INTEGER;
P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1114:}X:=BASEFILE↑.INT;
IF X<>125221776 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>26000 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>2100 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>1777 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>6 THEN GOTO 6666{:1114};{1116:}BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<0 THEN GOTO 6666;
IF X>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','string pool size');GOTO 6666;
END ELSE POOLPTR:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<0 THEN GOTO 6666;IF X>MAXSTRINGS THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','max strings');GOTO 6666;
END ELSE STRPTR:=X;END;
FOR K:=0 TO STRPTR DO BEGIN BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;
END;IF(X<0)OR(X>POOLPTR)THEN GOTO 6666 ELSE STRSTART[K]:=X;END;
STRREF[K]:=127;END;K:=0;WHILE K+4<POOLPTR DO BEGIN BEGIN GET(BASEFILE);
W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;STRPOOL[K+1]:=W.B1;
STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3;K:=K+4;END;K:=POOLPTR-4;
BEGIN GET(BASEFILE);W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;
STRPOOL[K+1]:=W.B1;STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3{:1116};{1118:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>26000)THEN GOTO 6666 ELSE ROVER:=X;END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
P:=Q+MEM[Q].HH.LH;
IF(P>26000)OR((Q>=MEM[Q+1].HH.RH)AND(MEM[Q+1].HH.RH<>ROVER))THEN GOTO
6666;Q:=MEM[Q+1].HH.RH;UNTIL Q=ROVER;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<26000 THEN GOTO 6666;
IF X>MEMMAX THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','mem max');GOTO 6666;
END ELSE MEMEND:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>MEMEND)THEN GOTO 6666 ELSE AVAIL:=X;END;
FOR K:=P TO MEMEND DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
BEGIN GET(BASEFILE);VARUSED:=BASEFILE↑.INT;END;BEGIN GET(BASEFILE);
DYNUSED:=BASEFILE↑.INT;END;MAXVARUSED:=VARUSED{:1118};{1120:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<1)OR(X>2229)THEN GOTO 6666 ELSE HASHUSED:=X;END;P:=0;
REPEAT BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<P+1)OR(X>HASHUSED)THEN GOTO 6666 ELSE P:=X;END;BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
UNTIL P=HASHUSED;FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
END;BEGIN GET(BASEFILE);STCOUNT:=BASEFILE↑.INT;END{:1120};{1122:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<32)OR(X>MAXINTERNAL)THEN GOTO 6666 ELSE INTPTR:=X;END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN GET(BASEFILE);
INTERNAL[K]:=BASEFILE↑.INT;END;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE INTNAME[K]:=X;END;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>3)THEN GOTO 6666 ELSE INTERACTION:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE BASEIDENT:=X;END;
BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<>69069)OR EOF(BASEFILE)THEN GOTO 6666{:1122};LOADBASEFILE:=TRUE;
GOTO 10;6666:WAKEUPTERMIN;
WRITELN(TTY,'(Fatal base file error; I''m stymied)');
LOADBASEFILE:=FALSE;10:END;{:1109}{1125:}{761:}PROCEDURE SCANPRIMARY;
LABEL 20,30,31,10;VAR P,Q:HALFWORD;C:QUARTERWORD;MYVARFLAG:0..81;
LDELIM,RDELIM:HALFWORD;{767:}GROUPLINE:INTEGER;{:767}{772:}
NUM,DENOM:SCALED;{:772}{779:}PREHEAD,POSTHEAD,TAIL:HALFWORD;
TT:SMALLNUMBER;T:HALFWORD;MACROREF:HALFWORD;{:779}
BEGIN MYVARFLAG:=VARFLAG;VARFLAG:=0;20:IF ARITHERROR THEN CLEARARITH;
{763:}IF PANICKING THEN CHECKMEM(FALSE);
IF INTERRUPT<>0 THEN IF OKTOINTERRUP THEN BEGIN BACKINPUT;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GETXNEXT;END{:763};
CASE CURCMD OF 30:{764:}BEGIN LDELIM:=CURSYM;RDELIM:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF(CURCMD=78)AND(CURTYPE>=16)THEN{766:}BEGIN P:=GETNODE(2);
MEM[P].HH.B0:=15;MEM[P].HH.B1:=11;INITBIGNODE(P);Q:=MEM[P+1].INT;
STASHIN(Q);GETXNEXT;SCANEXPRESSI;
IF CURTYPE<16 THEN BEGIN DISPERR(0,623);BEGIN HELPPTR:=4;
HELPLINE[3]:=624;HELPLINE[2]:=625;HELPLINE[1]:=626;HELPLINE[0]:=627;END;
FLUSHERROR(0);END;STASHIN(Q+2);CHECKDELIMIT(LDELIM,RDELIM);CURTYPE:=15;
CUREXP:=P;END{:766}ELSE CHECKDELIMIT(LDELIM,RDELIM);END{:764};31:{768:}
BEGIN GROUPLINE:=LINE;IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
BEGIN P:=GETAVAIL;MEM[P].HH.LH:=0;MEM[P].HH.RH:=SAVEPTR;SAVEPTR:=P;END;
REPEAT DOSTATEMENT;UNTIL CURCMD<>79;
IF CURCMD<>80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(628);END;PRINTINT(LINE);PRINT(629);BEGIN HELPPTR:=2;
HELPLINE[1]:=630;HELPLINE[0]:=631;END;BACKERROR;CURCMD:=80;END;UNSAVE;
IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);END{:768};40:{769:}
BEGIN CURTYPE:=4;CUREXP:=CURMOD;END{:769};41:{773:}BEGIN CUREXP:=CURMOD;
CURTYPE:=16;GETXNEXT;IF CURCMD<>54 THEN DENOM:=0 ELSE BEGIN GETXNEXT;
IF CURCMD<>41 THEN BEGIN BACKINPUT;CURCMD:=54;CURMOD:=68;CURSYM:=2233;
GOTO 10;END;NUM:=CUREXP;DENOM:=CURMOD;IF DENOM=0 THEN{774:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(632);
END;BEGIN HELPPTR:=1;HELPLINE[0]:=633;END;ERROR;END{:774}
ELSE CUREXP:=MAKESCALED(NUM,DENOM);GETXNEXT;END;
IF CURCMD>=29 THEN IF CURCMD<41 THEN BEGIN P:=STASHCUREXP;SCANPRIMARY;
IF(ABS(NUM)>=ABS(DENOM))OR(CURTYPE<15)THEN DOBINARY(P,67)ELSE BEGIN
FRACMULT(MAKEFRACTION(NUM,DENOM));FREENODE(P,2);END;END;GOTO 10;
END{:773};32:{770:}DONULLARY(CURMOD){:770};33,29,35,42:{771:}
BEGIN C:=CURMOD;GETXNEXT;SCANPRIMARY;DOUNARY(C);GOTO 10;END{:771};
36:{775:}BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF CURCMD<>67 THEN BEGIN MISSINGERR(338);PRINT(634);PRINTCMDMOD(36,C);
BEGIN HELPPTR:=1;HELPLINE[0]:=564;END;BACKERROR;END;P:=STASHCUREXP;
GETXNEXT;SCANPRIMARY;DOBINARY(P,C);GOTO 10;END{:775};34:{776:}
BEGIN GETXNEXT;SCANSUFFIX;OLDSETTING:=SELECTOR;SELECTOR:=5;
SHOWTOKENLIS(CUREXP,0,10000);FLUSHTOKENLI(CUREXP);CUREXP:=MAKESTRING;
SELECTOR:=OLDSETTING;CURTYPE:=4;GOTO 10;END{:776};37:{777:}
BEGIN Q:=CURMOD;IF MYVARFLAG=76 THEN BEGIN GETXNEXT;
IF CURCMD=76 THEN BEGIN CUREXP:=GETAVAIL;MEM[CUREXP].HH.LH:=Q+2243;
CURTYPE:=21;GOTO 10;END;BACKINPUT;END;CURTYPE:=16;CUREXP:=INTERNAL[Q];
END{:777};38:MAKEEXPCOPY(CURMOD);39:{780:}BEGIN PREHEAD:=GETAVAIL;
TAIL:=PREHEAD;POSTHEAD:=0;TT:=1;WHILE TRUE DO BEGIN T:=CURTOK;
MEM[TAIL].HH.RH:=T;IF TT<>0 THEN BEGIN{787:}BEGIN P:=MEM[PREHEAD].HH.RH;
Q:=MEM[P].HH.LH;TT:=0;IF EQTB[Q].LH MOD 82=39 THEN BEGIN Q:=EQTB[Q].RH;
WHILE TRUE DO BEGIN P:=MEM[P].HH.RH;IF P=0 THEN BEGIN TT:=MEM[Q].HH.B0;
GOTO 31;END;IF MEM[Q].HH.B0<>22 THEN GOTO 31;
Q:=MEM[MEM[Q+1].HH.LH].HH.RH;
IF P>26000 THEN BEGIN REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q+2].HH.LH>=MEM[P].HH.LH;
IF MEM[Q+2].HH.LH>MEM[P].HH.LH THEN GOTO 31;END;END;END;31:END{:787};
IF TT>=23 THEN{781:}BEGIN MEM[TAIL].HH.RH:=0;
IF TT>23 THEN BEGIN POSTHEAD:=GETAVAIL;TAIL:=POSTHEAD;
MEM[TAIL].HH.RH:=T;TT:=0;MACROREF:=MEM[Q+1].INT;
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH+1;END ELSE{790:}
BEGIN P:=GETAVAIL;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=P;MEM[P].HH.LH:=T;MACROCALL(MEM[Q+1].INT,PREHEAD,0);
GETXNEXT;GOTO 20;END{:790};END{:781};END;GETXNEXT;TAIL:=T;
IF CURCMD=52 THEN{782:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURCMD<>63 THEN{783:}BEGIN BACKINPUT;BACKEXPR;CURCMD:=52;
CURSYM:=2232;END{:783}ELSE BEGIN IF CURTYPE<>16 THEN BADSUBSCRIPT;
CURCMD:=41;CURMOD:=CUREXP;CURSYM:=0;END;END{:782};
IF CURCMD<>41 THEN IF CURCMD<>39 THEN GOTO 30;END;30:{789:}
IF POSTHEAD<>0 THEN{791:}BEGIN BACKINPUT;P:=GETAVAIL;
Q:=MEM[POSTHEAD].HH.RH;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=POSTHEAD;MEM[POSTHEAD].HH.LH:=Q;
MEM[POSTHEAD].HH.RH:=P;MEM[P].HH.LH:=MEM[Q].HH.RH;MEM[Q].HH.RH:=0;
MACROCALL(MACROREF,PREHEAD,0);
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH-1;GETXNEXT;GOTO 20;END{:791};
Q:=MEM[PREHEAD].HH.RH;BEGIN MEM[PREHEAD].HH.RH:=AVAIL;AVAIL:=PREHEAD;
DYNUSED:=DYNUSED-1;END;IF CURCMD=MYVARFLAG THEN BEGIN CURTYPE:=21;
CUREXP:=Q;GOTO 10;END;P:=FINDVARIABLE(Q);
IF P=0 THEN BEGIN OBLITERATED(Q);HELPLINE[2]:=645;HELPLINE[1]:=646;
HELPLINE[0]:=647;FLUSHNODELIS(Q);BACKINPUT;CURCMD:=41;CURMOD:=0;
CURSYM:=0;INSERROR;GOTO 20;END;FLUSHNODELIS(Q);MAKEEXPCOPY(P);
GOTO 10{:789};END{:780};OTHERS:BEGIN BADEXP(617);GOTO 20;END END;
GETXNEXT;10:END;{:761}{798:}PROCEDURE SCANSUFFIX;LABEL 30;
VAR H,T:HALFWORD;P:HALFWORD;BEGIN H:=GETAVAIL;T:=H;
WHILE TRUE DO BEGIN IF CURCMD=52 THEN{799:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>16 THEN BADSUBSCRIPT;
IF CURCMD<>63 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=649;HELPLINE[1]:=650;HELPLINE[0]:=543;END;BACKERROR;END;
CURCMD:=41;CURMOD:=CUREXP;END{:799};
IF CURCMD=41 THEN P:=NEWNUMTOK(CURMOD)ELSE IF CURCMD=39 THEN BEGIN P:=
GETAVAIL;MEM[P].HH.LH:=CURSYM;END ELSE GOTO 30;MEM[T].HH.RH:=P;T:=P;
GETXNEXT;END;30:CUREXP:=MEM[H].HH.RH;BEGIN MEM[H].HH.RH:=AVAIL;AVAIL:=H;
DYNUSED:=DYNUSED-1;END;CURTYPE:=21;END;{:798}{800:}
PROCEDURE SCANSECONDAR;LABEL 20,22,10;VAR P,Q,R:HALFWORD;C,D:HALFWORD;
MACNAME:HALFWORD;BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(651);
SCANPRIMARY;
22:IF CURCMD>=51 THEN IF CURCMD<=55 THEN BEGIN P:=STASHCUREXP;C:=CURMOD;
D:=CURCMD;IF D=53 THEN BEGIN MACNAME:=CURSYM;
MEM[C].HH.LH:=MEM[C].HH.LH+1;END;GETXNEXT;IF D=52 THEN{802:}
BEGIN SCANEXPRESSI;IF CURCMD<>78 THEN BEGIN{783:}BEGIN BACKINPUT;
BACKEXPR;CURCMD:=52;CURSYM:=2232;END{:783};GOTO 10;END;Q:=STASHCUREXP;
GETXNEXT;SCANEXPRESSI;IF CURCMD<>63 THEN BEGIN MISSINGERR(93);
BEGIN HELPPTR:=3;HELPLINE[2]:=652;HELPLINE[1]:=650;HELPLINE[0]:=543;END;
BACKERROR;END;R:=STASHCUREXP;MAKEEXPCOPY(Q);DOBINARY(R,66);
DOBINARY(P,67);DOBINARY(Q,65);GETXNEXT;END{:802}ELSE BEGIN SCANPRIMARY;
IF D<>53 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:800}{803:}PROCEDURE SCANTERTIARY;LABEL 20,22;
VAR P,Q,R:HALFWORD;C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(653);SCANSECONDAR;
IF CURTYPE=8 THEN MATERIALIZEP;
22:IF CURCMD>=42 THEN IF CURCMD<=46 THEN IF(CURCMD<>46)OR(CURTYPE<11)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=43 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
GETXNEXT;IF D=45 THEN{807:}BEGIN{808:}BEGIN UNSTASHCUREX(P);
Q:=NEWFRAGMENT;END{:808};IF CURCMD=60 THEN{812:}BEGIN GETXNEXT;
SCANEXPRESSI;IF(CURTYPE<>16)OR(CUREXP<0)THEN BEGIN DISPERR(0,666);
BEGIN HELPPTR:=1;HELPLINE[0]:=667;END;FLUSHERROR(65536);END;
MEM[Q].HH.B1:=3;MEM[Q+5].INT:=CUREXP;END{:812}ELSE{813:}
BEGIN MEM[Q].HH.B1:=2;SCANEXPRESSI;IF CURTYPE>15 THEN{814:}
BEGIN IF CURTYPE<>16 THEN BEGIN DISPERR(0,662);BEGIN HELPPTR:=3;
HELPLINE[2]:=663;HELPLINE[1]:=660;HELPLINE[0]:=661;END;FLUSHERROR(0);
END;MEM[Q+5].INT:=CUREXP;IF CURCMD<>78 THEN BEGIN MISSINGERR(44);
BEGIN HELPPTR:=2;HELPLINE[1]:=668;HELPLINE[0]:=669;END;BACKERROR;END;
GETXNEXT;SCANEXPRESSI;IF CURTYPE<>16 THEN BEGIN DISPERR(0,664);
BEGIN HELPPTR:=3;HELPLINE[2]:=665;HELPLINE[1]:=660;HELPLINE[0]:=661;END;
FLUSHERROR(0);END;MEM[Q+6].INT:=CUREXP;END{:814}ELSE BEGIN P:=KNOWNPAIR;
IF P=0 THEN BEGIN MEM[Q+5].INT:=0;MEM[Q+6].INT:=0;
END ELSE BEGIN MEM[Q+5].INT:=MEM[P+1].INT;MEM[Q+6].INT:=MEM[P+3].INT;
FREENODE(P,4);END;END;END{:813};
IF CURCMD<>64 THEN BEGIN MISSINGERR(125);BEGIN HELPPTR:=3;
HELPLINE[2]:=656;HELPLINE[1]:=657;HELPLINE[0]:=543;END;BACKERROR;END;
CURTYPE:=13;CUREXP:=Q;GETXNEXT;END{:807}ELSE BEGIN SCANSECONDAR;
IF D<>43 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;END;
{:803}{815:}PROCEDURE SCANEXPRESSI;LABEL 20,30,31,22,25,10;
VAR P,Q,R,PP,QQ:HALFWORD;C,D:HALFWORD;MYVARFLAG:0..81;MACNAME:HALFWORD;
CYCLEHIT:BOOLEAN;ABORTPATH:BOOLEAN;GIVENLIST:HALFWORD;X,Y,T:SCALED;
BEGIN MYVARFLAG:=VARFLAG;20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(670);
SCANTERTIARY;
22:IF CURCMD>=46 THEN IF CURCMD<=50 THEN IF(CURCMD<>50)OR(MYVARFLAG<>76)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=48 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
IF D<=47 THEN{816:}BEGIN{818:}BEGIN ABORTPATH:=FALSE;GIVENLIST:=0;
IF MEM[P].HH.B0=15 THEN BEGIN UNSTASHCUREX(P);P:=NEWFRAGMENT;
END ELSE IF(MEM[P].HH.B0=11)OR(MEM[P].HH.B0=13)THEN BEGIN Q:=P;
P:=MEM[P+1].INT;FREENODE(Q,2);END ELSE BEGIN ABORTPATH:=TRUE;
Q:=GETNODE(7);GOTO 30;END;Q:=P;
IF MEM[P].HH.B0=5 THEN BEGIN R:=FIXFRAGMENT(P);
IF R<>0 THEN BEGIN MEM[R].HH.RH:=GIVENLIST;GIVENLIST:=R;END;
END ELSE BEGIN MEM[P].HH.B0:=0;
WHILE MEM[MEM[Q].HH.RH].HH.B0<>0 DO Q:=MEM[Q].HH.RH;MEM[Q].HH.B1:=0;END;
30:END{:818};25:D:=CURCMD;IF D=47 THEN{820:}BEGIN GETXNEXT;
IF CURCMD=59 THEN{823:}IF CURMOD=0 THEN BEGIN MEM[Q+6].INT:=0;T:=0;
GETXNEXT;END ELSE BEGIN GETXNEXT;SCANPRIMARY;{824:}
IF(CURTYPE<>16)OR(CUREXP<49152)THEN BEGIN DISPERR(0,674);
BEGIN HELPPTR:=1;HELPLINE[0]:=675;END;FLUSHERROR(65536);END{:824};
MEM[Q+6].INT:=CUREXP;IF CURCMD=51 THEN BEGIN GETXNEXT;SCANPRIMARY;{824:}
IF(CURTYPE<>16)OR(CUREXP<49152)THEN BEGIN DISPERR(0,674);
BEGIN HELPPTR:=1;HELPLINE[0]:=675;END;FLUSHERROR(65536);END{:824};END;
T:=CUREXP;END{:823}ELSE IF CURCMD=58 THEN{825:}BEGIN MEM[Q].HH.B1:=1;
GETXNEXT;SCANPRIMARY;PP:=KNOWNPAIR;IF PP=0 THEN BEGIN MEM[Q+5].INT:=0;
MEM[Q+6].INT:=0;END ELSE BEGIN MEM[Q+5].INT:=MEM[PP+1].INT;
MEM[Q+6].INT:=MEM[PP+3].INT;FREENODE(PP,4);END;
IF CURCMD<>51 THEN BEGIN X:=MEM[Q+5].INT;Y:=MEM[Q+6].INT;
END ELSE BEGIN GETXNEXT;SCANPRIMARY;PP:=KNOWNPAIR;
IF PP=0 THEN BEGIN X:=0;Y:=0;END ELSE BEGIN X:=MEM[PP+1].INT;
Y:=MEM[PP+3].INT;FREENODE(PP,4);END;END;END{:825}
ELSE BEGIN MEM[Q+6].INT:=65536;T:=65536;BACKINPUT;GOTO 31;END;
IF CURCMD<>47 THEN BEGIN MISSINGERR(279);BEGIN HELPPTR:=1;
HELPLINE[0]:=671;END;BACKERROR;END;31:END{:820};GETXNEXT;
IF(CURCMD=35)AND NOT ABORTPATH THEN{827:}BEGIN CYCLEHIT:=TRUE;GETXNEXT;
PP:=P;QQ:=P;IF D=46 THEN IF P=Q THEN BEGIN D:=47;MEM[Q+6].INT:=65536;
T:=65536;END;END{:827}ELSE BEGIN CYCLEHIT:=FALSE;SCANTERTIARY;
IF ABORTPATH THEN{817:}BEGIN FREENODE(Q,7);
IF D=47 THEN BADBINARY(P,89)ELSE BADBINARY(P,78);GOTO 22;END{:817};
{826:}
BEGIN IF(CURTYPE<>11)AND(CURTYPE<>13)THEN PP:=NEWFRAGMENT ELSE PP:=
CUREXP;QQ:=PP;IF MEM[PP].HH.B0=5 THEN BEGIN R:=FIXFRAGMENT(PP);
IF R<>0 THEN BEGIN MEM[R].HH.RH:=GIVENLIST;GIVENLIST:=R;END;
END ELSE BEGIN MEM[PP].HH.B0:=0;
WHILE MEM[MEM[QQ].HH.RH].HH.B0<>0 DO QQ:=MEM[QQ].HH.RH;MEM[QQ].HH.B1:=0;
END;END{:826};END;{828:}
BEGIN IF D=46 THEN IF(MEM[Q+1].INT<>MEM[PP+1].INT)OR(MEM[Q+2].INT<>MEM[
PP+2].INT)THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(676);END;BEGIN HELPPTR:=3;HELPLINE[2]:=677;
HELPLINE[1]:=678;HELPLINE[0]:=679;END;ERROR;D:=47;MEM[Q+6].INT:=65536;
T:=65536;END;IF D=46 THEN{829:}
BEGIN IF MEM[Q].HH.B0=4 THEN MEM[Q].HH.B0:=3;
IF MEM[PP].HH.B1=4 THEN MEM[PP].HH.B1:=3;MEM[Q].HH.B1:=MEM[PP].HH.B1;
MEM[Q+5].INT:=MEM[PP+5].INT;MEM[Q+6].INT:=MEM[PP+6].INT;
MEM[Q].HH.RH:=MEM[PP].HH.RH;FREENODE(PP,7);IF QQ=PP THEN QQ:=Q;END{:829}
ELSE BEGIN MEM[Q].HH.RH:=PP;
IF MEM[Q].HH.B1<>1 THEN BEGIN MEM[PP+4].INT:=T;
IF MEM[PP].HH.B0=0 THEN MEM[PP].HH.B0:=4;
IF MEM[Q].HH.B1=0 THEN MEM[Q].HH.B1:=4;END ELSE BEGIN MEM[PP+3].INT:=X;
MEM[PP+4].INT:=Y;MEM[PP].HH.B0:=1;END;END;Q:=QQ;END{:828};
IF CURCMD>=46 THEN IF CURCMD<=47 THEN IF NOT CYCLEHIT THEN GOTO 25;
{830:}IF CYCLEHIT THEN BEGIN IF D=46 THEN P:=Q;
END ELSE BEGIN MEM[P].HH.B0:=0;IF MEM[P].HH.B1=4 THEN MEM[P].HH.B1:=3;
MEM[Q].HH.B1:=0;IF MEM[Q].HH.B0=4 THEN MEM[Q].HH.B0:=3;MEM[Q].HH.RH:=P;
END;MAKECHOICES(P,GIVENLIST);CURTYPE:=11;CUREXP:=P{:830};
IF CYCLEHIT THEN GOTO 10;END{:816}ELSE BEGIN GETXNEXT;SCANTERTIARY;
IF D<>48 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
IF CURTYPE=13 THEN{831:}BEGIN CURTYPE:=11;MEM[CUREXP].HH.B0:=0;
MEM[CUREXP].HH.B1:=0;END{:831};10:END;{:815}{832:}PROCEDURE GETBOOLEAN;
BEGIN GETXNEXT;SCANEXPRESSI;IF CURTYPE<>2 THEN BEGIN DISPERR(0,680);
BEGIN HELPPTR:=2;HELPLINE[1]:=681;HELPLINE[0]:=682;END;FLUSHERROR(0);
CURTYPE:=2;CUREXP:=31;END;END;{:832}{1128:}PROCEDURE CLOSEFILESAN;
VAR K:INTEGER;LH:INTEGER;P:HALFWORD;X:SCALED;
BEGIN IF INTERNAL[10]>0 THEN{1130:}
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE,' ');
WRITELN(LOGFILE,'Here is how much of METAFONT''s memory',' you used:');
WRITE(LOGFILE,' ',STRPTR-INITSTRPTR:1,' string');
IF STRPTR<>INITSTRPTR+1 THEN WRITE(LOGFILE,'s');
WRITELN(LOGFILE,' out of ',MAXSTRINGS-INITSTRPTR:1);
WRITELN(LOGFILE,' ',POOLPTR-INITPOOLPTR:1,' string characters out of ',
POOLSIZE-INITPOOLPTR:1);
WRITELN(LOGFILE,' ',MAXVARUSED:1,'&',MEMEND-25999:1,
' words of memory out of ',26000:1,'&',MEMMAX-25999:1);
WRITELN(LOGFILE,' ',STCOUNT:1,' symbolic tokens out of ',2100:1);
WRITELN(LOGFILE,' ',MAXINSTACK:1,'i,',INTPTR:1,'n,',MAXPARAMSTAC:1,'p,',
MAXBUFSTACK+1:1,'b stack positions out of ',STACKSIZE:1,'i,',MAXINTERNAL
:1,'n,',150:1,'p,',BUFSIZE:1,'b');END{:1130};WAKEUPTERMIN;{1129:}
IF(GFPREVPTR>0)OR(INTERNAL[27]>0)THEN BEGIN{171:}ROVER:=27;
MEM[ROVER].HH.RH:=262143;MEM[ROVER].HH.LH:=26000-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[26000].HH.RH:=0;
MEM[26000].HH.LH:=0;{:171};{1051:}MEM[26001].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN TFMWIDTH[K]:=SORTIN(TFMWIDTH[K])
;NW:=SKIMP(255)+1;DIMENHEAD[1]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(18){:1051};FIXCHECKSUM;
FIXDESIGNSIZ;IF INTERNAL[27]>0 THEN BEGIN{1053:}MEM[26001].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMHEIGHT[K]=0 THEN TFMHEIGHT
[K]:=21 ELSE TFMHEIGHT[K]:=SORTIN(TFMHEIGHT[K]);NH:=SKIMP(15)+1;
DIMENHEAD[2]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(19);MEM[26001].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMDEPTH[K]=0 THEN TFMDEPTH[K
]:=21 ELSE TFMDEPTH[K]:=SORTIN(TFMDEPTH[K]);ND:=SKIMP(15)+1;
DIMENHEAD[3]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(20);MEM[26001].HH.RH:=19;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMITALCORR[K]=0 THEN
TFMITALCORR[K]:=21 ELSE TFMITALCORR[K]:=SORTIN(TFMITALCORR[K]);
NI:=SKIMP(15)+1;DIMENHEAD[4]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(21){:1053};{1059:}
IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(590);
WHILE NOT TFMBOPENOUT(TFMFILE)DO PROMPTFILENA(887,590);
METRICFILENA:=BMAKENAMESTR(TFMFILE);{1060:}K:=HEADERSIZE;
WHILE HEADERBYTE[K]<0 DO K:=K-1;LH:=(K+3)DIV 4;IF BC>EC THEN BC:=1;
TFMTWO(6+LH+(EC-BC+1)+NW+NH+ND+NI+NL+NK+NE+NP);TFMTWO(LH);TFMTWO(BC);
TFMTWO(EC);TFMTWO(NW);TFMTWO(NH);TFMTWO(ND);TFMTWO(NI);TFMTWO(NL);
TFMTWO(NK);TFMTWO(NE);TFMTWO(NP);
FOR K:=1 TO 4*LH DO IF HEADERBYTE[K]<0 THEN WRITE(TFMFILE,0)ELSE WRITE(
TFMFILE,HEADERBYTE[K]){:1060};{1061:}
FOR K:=BC TO EC DO IF NOT CHAREXISTS[K]THEN TFMFOUR(0)ELSE BEGIN WRITE(
TFMFILE,MEM[TFMWIDTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMHEIGHT[K]].HH.LH)*16+MEM[TFMDEPTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMITALCORR[K]].HH.LH)*4+CHARTAG[K]);
WRITE(TFMFILE,CHARREMAINDE[K]);END{:1061};{1064:}TFMCHANGED:=0;
FOR K:=1 TO 4 DO BEGIN TFMFOUR(0);P:=DIMENHEAD[K];
WHILE P<>19 DO BEGIN TFMDIMENOUT(MEM[P+1].INT);P:=MEM[P].HH.RH;END;
END{:1064};{1065:}FOR K:=0 TO NL-1 DO TFMQQQQ(LIGKERN[K]);
FOR K:=0 TO NK-1 DO TFMDIMENOUT(KERN[K]){:1065};{1066:}
FOR K:=0 TO NE-1 DO TFMQQQQ(EXTEN[K]){:1066};{1067:}
FOR K:=1 TO NP DO IF K=1 THEN IF ABS(PARAM[1])<134217728 THEN TFMFOUR(
PARAM[1]*16)ELSE BEGIN TFMCHANGED:=TFMCHANGED+1;
IF PARAM[1]>0 THEN TFMFOUR(2147483647)ELSE TFMFOUR(-2147483647);
END ELSE TFMDIMENOUT(PARAM[K]);
IF TFMCHANGED>0 THEN BEGIN IF TFMCHANGED=1 THEN PRINTNL(889)ELSE BEGIN
PRINTNL(40);PRINTINT(TFMCHANGED);PRINT(890);END;PRINT(891);END{:1067};
PRINTNL(888);PRINT(METRICFILENA);BCLOSE(TFMFILE){:1059};END;
IF GFPREVPTR>0 THEN{1104:}BEGIN BEGIN GFBUF[GFPTR]:=248;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFPREVPTR);
GFPREVPTR:=GFOFFSET+GFPTR-5;GFFOUR(INTERNAL[23]*16);
FOR K:=1 TO 4 DO IF HEADERBYTE[K]<0 THEN BEGIN GFBUF[GFPTR]:=0;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE BEGIN GFBUF[GFPTR]:=HEADERBYTE[K];GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(INTERNAL[24]);
GFFOUR(INTERNAL[25]);GFFOUR(GFMINX);GFFOUR(GFMAXX-1);GFFOUR(GFMINY);
GFFOUR(GFMAXY);
FOR K:=0 TO 255 DO IF CHAREXISTS[K]THEN BEGIN BEGIN GFBUF[GFPTR]:=246;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=K;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFWIDTH[K]);
X:=MEM[TFMWIDTH[K]+1].INT;
IF ABS(X)>=MAXTFMDIMEN THEN IF X>0 THEN X:=16777215 ELSE X:=-16777215
ELSE X:=MAKESCALED(X*16,INTERNAL[23]);GFFOUR(X);GFFOUR(CHARPTR[K]);END;
BEGIN GFBUF[GFPTR]:=249;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(GFPREVPTR);BEGIN GFBUF[GFPTR]:=129;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=4+((GFBUFSIZE-GFPTR)MOD 4);
WHILE K>0 DO BEGIN BEGIN GFBUF[GFPTR]:=223;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=K-1;END;{1082:}
IF GFLIMIT=HALFBUF THEN WRITEGF(HALFBUF,GFBUFSIZE-1);
IF GFPTR>0 THEN WRITEGF(0,GFPTR-1){:1082};PRINTNL(900);
PRINT(OUTPUTFILENA);PRINT(426);PRINTINT(TOTALCHARS);PRINT(901);
IF TOTALCHARS<>1 THEN PRINTCHAR(115);PRINT(902);
PRINTINT(GFOFFSET+GFPTR);PRINT(903);BCLOSE(GFFILE);
IF PSEUDOTYPEIN=0 THEN IF INTERNAL[28]>0 THEN BEGIN K:=SELECTOR;
SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];PRINT(904);PRINT(OUTPUTFILENA);
SELECTOR:=K;
IF POOLPTR<POOLSIZE THEN IF STRPTR<MAXSTRINGS THEN PSEUDOTYPEIN:=
MAKESTRING;END;END{:1104};END{:1129};
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE);ACLOSE(LOGFILE);
SELECTOR:=SELECTOR-2;IF SELECTOR=1 THEN BEGIN PRINTNL(915);
PRINT(LOGNAME);PRINTCHAR(46);END;END;
IF(PSEUDOTYPEIN<>0)AND(INTERACTION>0)THEN BEGIN WRITELN(TTY);
FOR K:=STRSTART[PSEUDOTYPEIN]TO STRSTART[PSEUDOTYPEIN+1]-1 DO PTWR1W(0,
ORD(XCHR[STRPOOL[K]]));END;END;{:1128}{1131:}PROCEDURE FINALCLEANUP;
LABEL 10;VAR C:SMALLNUMBER;BEGIN C:=CURMOD;
IF JOBNAME=0 THEN OPENLOGFILE;WHILE CONDPTR<>0 DO BEGIN PRINTNL(916);
IF CURIF=1 THEN PRINT(565)ELSE PRINT(567);
IF IFLINE<>0 THEN BEGIN PRINT(917);PRINTINT(IFLINE);END;PRINT(918);
IFLINE:=MEM[CONDPTR+1].INT;CURIF:=MEM[CONDPTR].HH.B1;
CONDPTR:=MEM[CONDPTR].HH.RH;END;
IF HISTORY<>0 THEN IF((HISTORY=1)OR(INTERACTION<3))THEN IF SELECTOR=3
THEN BEGIN SELECTOR:=1;PRINTNL(919);SELECTOR:=3;END;
IF C=1 THEN BEGIN STOREBASEFIL;GOTO 10;PRINTNL(920);GOTO 10;END;10:END;
{:1131}{1132:}PROCEDURE INITPRIM;BEGIN{186:}PRIMITIVE(280,37,1);
PRIMITIVE(281,37,2);PRIMITIVE(282,37,3);PRIMITIVE(283,37,4);
PRIMITIVE(284,37,5);PRIMITIVE(285,37,6);PRIMITIVE(286,37,7);
PRIMITIVE(287,37,8);PRIMITIVE(288,37,9);PRIMITIVE(289,37,10);
PRIMITIVE(290,37,11);PRIMITIVE(291,37,12);PRIMITIVE(292,37,13);
PRIMITIVE(293,37,14);PRIMITIVE(294,37,15);PRIMITIVE(295,37,16);
PRIMITIVE(296,37,17);PRIMITIVE(297,37,18);PRIMITIVE(298,37,19);
PRIMITIVE(299,37,20);PRIMITIVE(300,37,21);PRIMITIVE(301,37,22);
PRIMITIVE(302,37,23);PRIMITIVE(303,37,24);PRIMITIVE(304,37,25);
PRIMITIVE(305,37,26);PRIMITIVE(306,37,27);PRIMITIVE(307,37,28);
PRIMITIVE(308,37,29);PRIMITIVE(309,37,30);PRIMITIVE(310,37,31);
PRIMITIVE(311,37,32);{:186}{205:}PRIMITIVE(279,47,0);PRIMITIVE(91,52,0);
EQTB[2232]:=EQTB[CURSYM];PRIMITIVE(93,63,0);PRIMITIVE(125,64,0);
PRIMITIVE(123,45,0);PRIMITIVE(58,77,0);EQTB[2234]:=EQTB[CURSYM];
PRIMITIVE(323,76,0);PRIMITIVE(44,78,0);PRIMITIVE(59,79,0);
EQTB[2235]:=EQTB[CURSYM];PRIMITIVE(92,7,0);EQTB[2239]:=EQTB[CURSYM];
PRIMITIVE(324,17,0);PRIMITIVE(325,70,0);PRIMITIVE(316,31,0);
EQTB[2240]:=EQTB[CURSYM];PRIMITIVE(326,72,0);PRIMITIVE(327,58,0);
PRIMITIVE(328,18,0);PRIMITIVE(329,60,0);PRIMITIVE(330,26,0);
PRIMITIVE(331,9,0);PRIMITIVE(317,80,0);EQTB[2241]:=EQTB[CURSYM];
PRIMITIVE(332,25,0);PRIMITIVE(333,6,0);PRIMITIVE(334,68,0);
PRIMITIVE(335,11,0);PRIMITIVE(336,12,0);PRIMITIVE(337,13,0);
PRIMITIVE(338,67,0);PRIMITIVE(339,71,0);PRIMITIVE(340,27,0);
PRIMITIVE(341,23,0);PRIMITIVE(342,15,0);PRIMITIVE(343,10,0);
PRIMITIVE(344,16,0);PRIMITIVE(345,73,0);PRIMITIVE(346,34,0);
PRIMITIVE(347,69,0);PRIMITIVE(348,74,0);{:205}{630:}PRIMITIVE(496,14,1);
PRIMITIVE(497,14,2);PRIMITIVE(498,14,53);PRIMITIVE(499,14,43);
PRIMITIVE(500,14,48);PRIMITIVE(318,14,0);EQTB[2237]:=EQTB[CURSYM];
PRIMITIVE(501,4,2394);PRIMITIVE(502,4,2544);PRIMITIVE(503,4,1);
PRIMITIVE(319,4,0);EQTB[2236]:=EQTB[CURSYM];{:630}{637:}
PRIMITIVE(508,61,0);PRIMITIVE(509,61,1);PRIMITIVE(64,61,2);
PRIMITIVE(510,61,3);{:637}{644:}PRIMITIVE(520,57,2394);
PRIMITIVE(521,57,2544);PRIMITIVE(522,57,2694);PRIMITIVE(523,57,1);
PRIMITIVE(524,57,2);PRIMITIVE(525,57,3);{:644}{659:}PRIMITIVE(536,3,0);
PRIMITIVE(461,3,1);{:659}{686:}PRIMITIVE(565,1,1);PRIMITIVE(315,2,2);
EQTB[2238]:=EQTB[CURSYM];PRIMITIVE(566,2,3);PRIMITIVE(567,2,4);{:686}
{821:}PRIMITIVE(672,59,1);PRIMITIVE(673,59,0);{:821}{833:}
PRIMITIVE(222,32,30);PRIMITIVE(223,32,31);PRIMITIVE(224,32,32);
PRIMITIVE(225,32,33);PRIMITIVE(226,32,34);PRIMITIVE(227,32,35);
PRIMITIVE(228,32,36);PRIMITIVE(229,32,37);PRIMITIVE(230,33,38);
PRIMITIVE(212,33,39);PRIMITIVE(231,33,40);PRIMITIVE(232,33,41);
PRIMITIVE(233,33,42);PRIMITIVE(234,33,43);PRIMITIVE(235,33,44);
PRIMITIVE(236,33,45);PRIMITIVE(237,33,46);PRIMITIVE(238,33,47);
PRIMITIVE(239,33,48);PRIMITIVE(240,33,49);PRIMITIVE(241,33,50);
PRIMITIVE(242,33,51);PRIMITIVE(243,33,52);PRIMITIVE(244,33,53);
PRIMITIVE(245,33,54);PRIMITIVE(246,33,55);PRIMITIVE(247,33,56);
PRIMITIVE(248,33,57);PRIMITIVE(249,33,58);PRIMITIVE(250,33,59);
PRIMITIVE(253,33,62);PRIMITIVE(254,33,63);PRIMITIVE(251,33,60);
PRIMITIVE(252,33,61);PRIMITIVE(255,35,64);PRIMITIVE(43,42,65);
PRIMITIVE(45,42,66);PRIMITIVE(42,55,67);PRIMITIVE(47,54,68);
EQTB[2233]:=EQTB[CURSYM];PRIMITIVE(256,44,69);PRIMITIVE(257,51,71);
PRIMITIVE(258,44,70);PRIMITIVE(60,49,72);PRIMITIVE(259,49,73);
PRIMITIVE(62,49,74);PRIMITIVE(260,49,75);PRIMITIVE(61,50,76);
PRIMITIVE(261,49,77);PRIMITIVE(262,36,90);PRIMITIVE(263,36,91);
PRIMITIVE(264,36,92);PRIMITIVE(265,36,93);PRIMITIVE(266,36,94);
PRIMITIVE(267,36,95);PRIMITIVE(268,36,96);PRIMITIVE(38,46,78);
PRIMITIVE(269,44,79);PRIMITIVE(270,55,80);PRIMITIVE(271,55,81);
PRIMITIVE(272,55,82);PRIMITIVE(273,55,83);PRIMITIVE(274,55,84);
PRIMITIVE(275,55,85);PRIMITIVE(276,55,86);PRIMITIVE(277,55,87);
PRIMITIVE(278,44,88);{:833}{946:}PRIMITIVE(215,29,19);
PRIMITIVE(200,29,4);PRIMITIVE(198,29,2);PRIMITIVE(207,29,11);
PRIMITIVE(202,29,6);PRIMITIVE(205,29,9);PRIMITIVE(210,29,14);
PRIMITIVE(211,29,15);{:946}{951:}PRIMITIVE(758,81,0);
PRIMITIVE(759,81,1);{:951}{956:}PRIMITIVE(145,22,0);PRIMITIVE(146,22,1);
PRIMITIVE(147,22,2);PRIMITIVE(764,22,3);{:956}{959:}PRIMITIVE(765,20,0);
PRIMITIVE(766,20,1);{:959}{969:}PRIMITIVE(779,21,0);PRIMITIVE(780,21,1);
PRIMITIVE(781,21,2);PRIMITIVE(782,21,3);PRIMITIVE(783,21,4);
PRIMITIVE(784,21,5);PRIMITIVE(785,21,6);{:969}{983:}PRIMITIVE(805,66,0);
PRIMITIVE(806,66,1);PRIMITIVE(807,66,2);PRIMITIVE(808,65,6);
PRIMITIVE(809,65,16);{:983}{1006:}PRIMITIVE(838,24,0);
PRIMITIVE(839,24,1);PRIMITIVE(840,24,2);{:1006}{1028:}
PRIMITIVE(851,19,0);PRIMITIVE(852,19,1);PRIMITIVE(853,19,2);
PRIMITIVE(854,19,3);PRIMITIVE(855,19,4);{:1028}{1036:}
PRIMITIVE(875,75,0);PRIMITIVE(876,75,128);{:1036}{1096:}
PRIMITIVE(895,28,4);PRIMITIVE(896,28,16);{:1096}{1149:}HASH[13].RH:=12;
EQTB[13].LH:=161;{:1149};END;PROCEDURE INITTAB;VAR K:INTEGER;BEGIN{170:}
{171:}ROVER:=27;MEM[ROVER].HH.RH:=262143;MEM[ROVER].HH.LH:=26000-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[26000].HH.RH:=0;
MEM[26000].HH.LH:=0;{:171};FOR K:=26001 TO 26003 DO MEM[K]:=MEM[26000];
AVAIL:=0;MEMEND:=26003;VARUSED:=27;DYNUSED:=4;MAXVARUSED:=VARUSED;{:170}
{187:}INTNAME[1]:=280;INTNAME[2]:=281;INTNAME[3]:=282;INTNAME[4]:=283;
INTNAME[5]:=284;INTNAME[6]:=285;INTNAME[7]:=286;INTNAME[8]:=287;
INTNAME[9]:=288;INTNAME[10]:=289;INTNAME[11]:=290;INTNAME[12]:=291;
INTNAME[13]:=292;INTNAME[14]:=293;INTNAME[15]:=294;INTNAME[16]:=295;
INTNAME[17]:=296;INTNAME[18]:=297;INTNAME[19]:=298;INTNAME[20]:=299;
INTNAME[21]:=300;INTNAME[22]:=301;INTNAME[23]:=302;INTNAME[24]:=303;
INTNAME[25]:=304;INTNAME[26]:=305;INTNAME[27]:=306;INTNAME[28]:=307;
INTNAME[29]:=308;INTNAME[30]:=309;INTNAME[31]:=310;INTNAME[32]:=311;
{:187}{197:}HASHUSED:=2229;STCOUNT:=0;HASH[2242].RH:=314;
HASH[2239].RH:=92;HASH[2238].RH:=315;HASH[2240].RH:=316;
HASH[2241].RH:=317;HASH[2237].RH:=318;HASH[2236].RH:=319;
HASH[2235].RH:=59;HASH[2234].RH:=58;HASH[2233].RH:=47;HASH[2232].RH:=91;
HASH[2231].RH:=41;HASH[2229].RH:=320;EQTB[2231].LH:=62;
MEM[26003].HH.LH:=2239;{:197}{221:}MEM[19].HH.LH:=2244;MEM[19].HH.RH:=0;
{:221}{318:}MEM[26000].HH.LH:=262143;{:318}{540:}MEM[13].HH.RH:=13;
MEM[14].HH.LH:=13;MEM[13].HH.LH:=0;MEM[14].HH.RH:=0;{:540}{650:}
MEM[25].HH.B1:=0;MEM[25].HH.RH:=2242;EQTB[2242].RH:=25;
EQTB[2242].LH:=CURINPUT.NAMEFIELD;{:650}{704:}EQTB[2230].LH:=87;
HASH[2230].RH:=582;{:704}{785:}MEM[26002].HH.LH:=2394;{:785}{1043:}
MEM[20].INT:=1073741824;{:1043}{1054:}MEM[22].INT:=0;MEM[21].HH.LH:=0;
{:1054}{1107:}BASEIDENT:=905;{:1107}END;{:1132}{1134:}
PROCEDURE DEBUGHELP;LABEL 888,10;VAR K,L,M,N:INTEGER;
BEGIN WHILE TRUE DO BEGIN WAKEUPTERMIN;PRINTNL(921);BREAK(TTY);
READ(TTY,M);IF M<0 THEN GOTO 10 ELSE IF M=0 THEN BEGIN GOTO 888;
888:M:=0;{'BREAKPOINT'}
END ELSE BEGIN READ(TTY,N);CASE M OF{1135:}1:PRINTWORD(MEM[N]);
2:PRINTINT(MEM[N].HH.LH);3:PRINTINT(MEM[N].HH.RH);
4:BEGIN PRINTINT(EQTB[N].LH);PRINTCHAR(58);PRINTINT(EQTB[N].RH);END;
5:PRINTVARIABL(N);6:PRINTINT(INTERNAL[N]);7:DOSHOWDEPEND(6);
9:SHOWTOKENLIS(N,0,1000);10:PRINT(N);11:CHECKMEM(N>0);12:SEARCHMEM(N);
13:BEGIN READ(TTY,L);PRINTCMDMOD(N,L);END;
14:FOR K:=0 TO N DO PRINT(BUFFER[K]);16:PANICKING:=NOT PANICKING;{:1135}
OTHERS:PRINT(63)END;END;END;10:END;{:1134}{1139:}
{FUNCTION TEXPHN:BOOLEAN;EXTERN;PROCEDURE TEXCHK;EXTERN;}{:1139}{1143:}
{PROCEDURE MAGIC;LABEL 10;TYPE BITS=0..35;VAR NUMCOUNTS:INTEGER;
JOBHRL:INTEGER;JUNK,I,J:INTEGER;SUCCESS:BOOLEAN;
HACK,MEMRY:PACKED RECORD CASE INTEGER OF 0:(XX:HALFWORD;P:↑INTEGER);
1:(Z:INTEGER);2:(LH:HALFWORD;RH:HALFWORD);
3:(SIXBIT:PACKED ARRAY[1..6]OF 0..63);4:(B:SET OF BITS)END;
BEGIN IF NOT TEXPHN THEN GOTO 10;[1144:]HACK.Z:=77;HACK.Z:=HACK.P↑;
JOBHRL:=HACK.RH[:1144];[1145:]NUMCOUNTS:=0;MEMRY.Z:=131073;
WHILE MEMRY.Z<JOBHRL DO BEGIN HACK.Z:=MEMRY.P↑;
IF(HACK.LH=120832)AND(HACK.RH=MEMRY.Z+1)THEN BEGIN MEMRY.Z:=MEMRY.Z+1;
MEM[NUMCOUNTS].INT:=MEMRY.Z;NUMCOUNTS:=NUMCOUNTS+1;END;
MEMRY.Z:=MEMRY.Z+1;END[:1145];[1146:]RESET(COUNTFILE,COUNTNAME,'/O');
IF NOT EOF(COUNTFILE)THEN BEGIN READLN(COUNTFILE,I);
IF I=NUMCOUNTS THEN FOR I:=0 TO NUMCOUNTS-1 DO BEGIN MEMRY.Z:=MEM[I].INT
;READLN(COUNTFILE,MEMRY.P↑);END;END;CLOSE(COUNTFILE)[:1146];
[1147:]WHILE TRUE DO BEGIN FOR I:=1 TO WRITEPERIOD DO BEGIN FOR J:=1 TO
CHECKPERIOD DO CALLI(25,,60,JUNK,SUCCESS);TEXCHK;END;
REWRITE(COUNTFILE,COUNTNAME);WRITELN(COUNTFILE,NUMCOUNTS);
FOR I:=0 TO NUMCOUNTS-1 DO BEGIN MEMRY.Z:=MEM[I].INT;
WRITELN(COUNTFILE,MEMRY.P↑:1);END;CLOSE(COUNTFILE);END[:1147];10:END;}
{:1143}{:1125}{1127:}BEGIN HISTORY:=3;;
IF READYALREADY=314159 THEN GOTO 1;{14:}BAD:=0;
IF(HALFERRORLIN<30)OR(HALFERRORLIN>ERRORLINE-15)THEN BAD:=1;
IF MAXPRINTLINE<60 THEN BAD:=2;IF GFBUFSIZE MOD 8<>0 THEN BAD:=3;
IF(26000<100)OR(26100>MEMMAX)THEN BAD:=4;IF 1777>2100 THEN BAD:=5;
IF HEADERSIZE MOD 4<>0 THEN BAD:=6;{:14}{148:}
IF(0>0)OR(511<127)THEN BAD:=11;IF(0>0)OR(262143<32767)THEN BAD:=12;
IF(0<0)OR(511>262143)THEN BAD:=13;IF(0<0)OR(MEMMAX>=262143)THEN BAD:=14;
IF MAXSTRINGS>262143 THEN BAD:=15;IF BUFSIZE>262143 THEN BAD:=16;{:148}
{198:}IF 2243+MAXINTERNAL>262143 THEN BAD:=21;{:198}{208:}
IF 2844>262143 THEN BAD:=22;{:208}{304:}
IF 15*11>BISTACKSIZE THEN BAD:=31;{:304}{508:}
IF 20+17*44>BISTACKSIZE THEN BAD:=32;{:508}{722:}
IF 18>FILENAMESIZE THEN BAD:=41;{:722}IF BAD>0 THEN BEGIN;
WRITE(TTY,'Ouch---my internal constants have been',' clobbered!---case '
,BAD:1);GOTO 9999;END;INITIALIZE;IF NOT GETSTRINGSST THEN GOTO 9999;
INITTAB;INITPRIM;READYALREADY:=314159;1:{55:}SELECTOR:=1;TALLY:=0;
TERMOFFSET:=0;FILEOFFSET:=0;{:55}{60:}
WRITE(TTY,'This is METAFONT, WAITS Version -40.0');
IF BASEIDENT=0 THEN WRITELN(TTY,' (no base preloaded)')ELSE BEGIN PRINT(
BASEIDENT);PRINTLN;END;{:60}{728:}JOBNAME:=0;{:728}{736:}
OUTPUTFILENA:=0;{:736}{1142:}{MAGIC;}{:1142};{1133:}BEGIN{605:}
BEGIN INPUTPTR:=0;MAXINSTACK:=0;INOPEN:=0;MAXBUFSTACK:=0;PARAMPTR:=0;
MAXPARAMSTAC:=0;FIRST:=1;CURINPUT.STARTFIELD:=1;CURINPUT.INDEXFIELD:=0;
LINE:=0;CURINPUT.NAMEFIELD:=0;FORCEEOF:=FALSE;
IF NOT INITTERMINAL THEN GOTO 9999;CURINPUT.LIMITFIELD:=LAST;
FIRST:=LAST+1;END;{:605}{608:}SCANNERSTATU:=0;{:608};
IF(BASEIDENT=0)OR(BUFFER[CURINPUT.LOCFIELD]=38)THEN BEGIN IF BASEIDENT<>
0 THEN INITIALIZE;IF NOT OPENBASEFILE THEN GOTO 9999;
IF NOT LOADBASEFILE THEN BEGIN WCLOSE(BASEFILE);GOTO 9999;END;
WCLOSE(BASEFILE);
WHILE(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD
]=32)DO CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIXDATEANDTI;
INITRANDOMS((INTERNAL[15]DIV 65536)+INTERNAL[14]);{69:}
IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD]<>
92)THEN STARTINPUT;END{:1133};INITSTRPTR:=STRPTR;INITPOOLPTR:=POOLPTR;
HISTORY:=0;MAINCONTROL;FINALCLEANUP;9998:CLOSEFILESAN;
9999:READYALREADY:=0;END.{:1127}